Чтение онлайн

ЖАНРЫ

Linux: Полное руководство

Аллен Питер В.

Шрифт:

♦ objdump — вывод информации из двоичных файлов;

♦ ranlib — генерирование индекса оглавления архива;

♦ size — вывод размеров секций архива или двоичного файла;

♦ strings — вывод строк, которые возможно прочитать, из двоичных файлов;

♦ addr2line — конвертирование адресов в памяти в строку в файле;

♦ nlmconv — конвертирует объектный код в NLM.

А теперь перечислим несколько полезных вспомогательных программ.

21.3.1. ansi2knr

Утилита ansi2knr предназначена для преобразования текстов программ, написанных в соответствии со стандартом ANSI С, в программы на «классическом» С Кернигана и Ричи. Формат вызова:

ansi2knr oldfile.c newfile.c

21.3.2. as

Программа as

это GNU-версия ассемблера, предназначенная для создания объектных файлов из программ, написанных на языке ассемблера. Формат вызова:

as [ключи] файл1 [файл2 ... файлN]

Ключи программы as Таблица 21.2

Ключ Назначение
– а Вывод листинга
– ad He выводить отладочные сообщения
– ad Включение в листинг текста программы, написанной на языке высокого уровни, если компиляций проводилась с ключом -g
– al Вывод листинга на ассемблере
– an Не обрабатывать форм
– as Вывод списка символов программы
– aфайл Вывести листинг в указанный файл
– f Быстрый режим. Директивы препроцессора не обрабатываются
– iпуть Добавить указанный путь к Include-пути
– MRI Обеспечить MRI-совместимость
– о файл Создание объектного файла с указанным именем
– R Поместить сегмент данных в сегмент кода
– v Вывод версии
– W Не выводить предупреждения

21.3.3. bison

Программа bisonэто грамматический разборщик (парсер): она создает C-программу, предназначенную для разбора определенной грамматики. Данная программа вам не понадобится до тех пор, пока вы не захотите написать собственный компилятор. Ключи программы представлены в таблице 21.3. Формат вызова:

bison [ключи] файл

Ключи программы bison Таблица 21.3

Ключ Назначение
– b префикс Использовать указанный префикс для имени входящего файла
– d Создать заголовочный файл, содержащий информацию о типах грамматических образцов (токенов), которые определены в вашей грамматике
– I Не вставлять код в существующие файлы
– о файл Установить файл результата
– t Включить отладочную информацию
– v Записать созданную программу в файл у.out put

21.3.4. flex

flex [параметры] файл

Это еще одна программа, которая пишет код за нас. Flex может написать программу на языке С, которая будет искать заданные образны текста в текстовых файлах и выполнять определенные действия, заданные программистом. Если вам нужна эта программа, тогда самое время прочитать страницы руководства man flex.

21.3.5. gprof

Программы

вроде gprof называются профайлерами. Они предназначены для определения быстродействия вашей программы. Для каждого вызова функции вашей программы профайлер выводит время ее выполнения. Вы как программист анализируете полученную информацию и, если нужно, оптимизируете исходный код вашей программы.

21.3.6. strip

Утилита strip удаляет таблицу символов из объектного файла.

21.4. Пример программы на С

В п. 9.2.3 я сказал о состояниях процесса и перечислил среди них состояние «зомби». Зомби — это процесс, который уже завершился, но его родитель еще не получил сигнала о его завершении и не удалил его структуру из таблицы процессов. Такое может произойти, когда процесс-родитель почему-либо не готов к завершению потомка. Сейчас мы искусственно создадим такого зомби. Процесс-родитель породит потомка и уснет на 10 секунд. Потомок завершится через 2 секунды, а в течение 8 секунд он будет находиться в состоянии зомби. Напоминаю, что состояние процесса можно увидеть по команде top.

Листинг 21.3. Файл zombie.с

#include <unistd.h>

#include <signal.h>

#include <stdlib.h>

#include <sys/wait.h>

#include <stdio.h>

int main {

 int pid;

 int status, died;

 pid=fork;

 switch(pid) {

 case -1:

printf("ошибка fork\n");

exit(-1);

 case 0:

printf(" Я потомок процесса %d\n", getppid);

printf(" Мой PID %d\n", getpid);

// Ждем 2 секунды и завершаемся

sleep(2);

exit(0);

 default:

printf("Я родитель.\n");

printf("Мой PID %d\n" , getpid);

// Ждем завершения дочернего процесса

// через 10 секунд, а потом убиваем его

sleep(10);

if (pid & 1)

kill(pid,SIGKILL);

died = wait(&status);

 }

}

Скомпилируйте файл

zombie.с
и запустите исполняемый файл
zombie
:

$ gcc -о zombie zombie.с

$ ./zombie

Я родитель.

Мой PID 1147

Я потомок процесса 1147

Мой PID 1148

Запомните последний номер и быстро переключитесь на другую консоль, где введите команду

top -p 1148
:

16:04:22 up 2 min, 3 users, load average: 0,10, 0,10, 0,04

1 processes: 0 sleeping, 0 running, 1 zombie, 0 stopped

CPU states: 4,5% user, 7,6% system, 0,0% nice, 0,0% iowait, 87,8% idle

Mem: 127560k av, 76992k used, 50568k free, 0k shrd, 3872k buff

24280k active, 19328k inactive

Swap: 152576k av, 0k used, 152576k free 39704k cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND

1148 den 17 0 0 0 0 Z 0,0 0,0 0:00 zombie <defunct>

Мы видим, что в списке процессов появился один зомби (STAT = Z), который «проживет» в таком состоянии целых 8 секунд.

Глава 22

Отладка, трассировка и оптимизация программ

Поделиться с друзьями: