Колисниченко Д.Н. - Linux-сервер своими руками (1077324), страница 35
Текст из файла (страница 35)
Родительский процесс может дожидаться окончания выполнения всех своих процессов-потомков с помощью системного вызова wait. Влюбой момент времени процесс может изменить содержимое своего образапамяти, используя одну из разновидностей вызова ехес(). Каждый процессреагирует на сигналы и, естественно, может установить собственную реакцию на сигналы, производимые операционной системой. Приоритет процесса может быть изменен с помощью системного вызова nice.Сигнал — это способ информирования процесса ядром о происшествиикакого-то события.
Если возникает несколько однотипных событий, процессу будет подан только один сигнал. Сигнал означает, что произошло событие, но ядро не сообщает, сколько таких событий произошло.Примеры сигналов:1. Окончание порожденного процесса (например, из-за системного вызова exit(см. ниже)).2. Возникновение исключительной ситуации.3. Сигналы, поступающие от пользователя, при нажатии определенных клавиш.Установить реакцию на поступление сигнала можно с помощью системного вызова signal:f u n c = signal (snum, f u n c t i o n ) ;где: snumномер сигнала;functionадрес функции, которая должна быть выполнена при поступлении указанного сигнала.Возвращаемое значение — адрес функции, которая будет реагировать напоступление сигнала.
Вместо function можно указать ноль или единицу. Еслибыл указан ноль, то при поступлении сигнала snum выполнение процессабудет прервано аналогично вызову exit. Если указать единицу, данный сигнал будет проигнорирован, но это возможно не для всех процессов.С помощью системного вызова kill можно сгенерировать сигналы ипередать их другим процессам. Обычно kill используется для того, чтобыпринудительно завершить («убить») процесс:kill(pid, snum);где: pidидентификатор процесса;snumномер сигнала, который будет передан процессу (см. табл.
5.1).Pid состоит из идентификатора группы процессов и идентификатора процесса в группе. Если вместо pid указать нуль, то сигнал snum будет направлен всемпроцессам, относящимся к данной группе (понятие группы процессов аналогично группе пользователей). В одну группу включаются процессы, имеющие общего предка. Идентификатор группы процесса можно изменить с помощью системного вызова setpgrp.
Если вместо pid указать -1, то ядро передаст сигнал всемпроцессам, идентификатор пользователя которых равен идентификатору текущего выполнения процесса, посылающего сигнал. Номера сигналов приведены втабл. 5Л. Сигналы (точнее, их номера) описаны в файле singnal.h.139ПроцессыТаблица 5.1Номера сигналовНомерНазваниеОписание01SIGHUPОсвобождение линии (hangup)02SIGINTПрерывание (interrupt)03SIGQUITВыход (quit)04SIGILL •Некорректная команда (illegal instruction). He переустанавливается при перехвате05SIGTRAPТрассировочное прерывание (trace trap).
He переустанавливается при перехвате06SIGIOT илиSIGABRTМашинная команда ЮТ. Останов ввода/вывода07SIGBUSОшибка на шине08SIGFPEИсключительная ситуация при выполнении операции с вещественными числами(floating-point exception)09SIGKILLУничтожение процесса (kill). He перехватывается и не игнорируется10Определяемый пользователем сигнал 111SIGUSR1SIGSEGV12SIGUSR2Определяемый пользователем сигнал 213SIGPIPEЗапись в канал, из которого некому читать.
Обрыв потока14SIGALRMБудильник15SIGTERMПрограммный сигнал завершения16SIGSTKFLTСбой стека17SIGCHLDИзменение статуса дочернего процесса(или SIGCLD)Некорректное обращение к сегменту памяти (segmentation violation)18SIGCONTПродолжение работы после сигнала STOP.
He перехватывается и не игнорируется19SIGSTOPСигнал СТОП. Не перехватывается и не игнорируется20SIGTSTPСигнал останова клавиатуры21SIGTTINФоновое чтение из терминала (tty)22SIGTTOUФоновая запись на терминал (tty)23SIGURGКритическое состояние сокета24SIGXCPUПревышенный предел процессорного времени2526SIGXFSZSIGVTALRMСигнал виртуального будильника27SIGPROFСигнал профилирующего будильника28SIGWINCHИзменение размера окна29SIGIOРазрешение ввода/вывода30SIGPWRСбой питания31SIGSYSНекорректный параметр системного вызоваПревышенный предел размера файлаДля нормального завершения процесса используется вызов:exit ( s t a t u s )где status — это целое число, возвращаемое процессу-предку для его информирования о причинах завершения процесса-потомка.Вызов exit может задаваться в любой точке программы, но может быть инеявным, например, при выходе из функции main (при программированиина С) оператор return 0 будет воспринят как системный вызов exit(O).5.2.
Перенаправление ввода/выводаПрактически все операционные системы обладают механизмом перенаправления ввода/вывода, и Linux не является исключением из этого правила.Обычно программы вводят текстовые данные с консоли (терминала) и740Процессывыводят данные на консоль. При вводе под консолью подразумеваетсяклавиатура, а при выводе — экран монитора. Клавиатура и экран монитора — это, соответственно, стандартный ввод и вывод (stdin и stdout). Любойввод/вывод можно интерпретировать как ввод из некоторого файла и выводв файл.
Работа с файлами производится через их дескрипторы. Для организации ввода/вывода в UNIX используются три файла: stdin (дескриптор 0),stdout (дескриптор 1) и stderr (дескриптор 2).Символ > («больше») используется для перенаправления стандартноговывода в файл. Например:$ cat > n e w f i l e . t x tВ этом примере стандартный вывод команды cat будет перенаправлен вфайл n e w f i l e . t x t , который будет создан после выполнения этой команды.Если файл с этим именем уже существует, то он будет перезаписан.
НажатиеCtrl + D остановит перенаправление и прервет выполнение команды cat.Символ < («меньше») используется для переназначения стандартного вводакоманды. Например, при выполнении команды cat < f i l e . t x t в качествестандартного ввода будет использован файл f i l e . t x t , а не клавиатура.Символ » используется для присоединения данных в конец файла(append) стандартного вывода команды. Например, в отличие от случая ссимволом >, выполнение команды cat » newfile.txt не перезапишет файл вслучае его существования, а добавит данные в его конец.Чтобы перенаправить весь стандартный поток ошибок в какой-нибудьфайл, используйте переадресацию 2> имя_файла или 2» имя_файла.
Впервом случае стандартный поток ошибок будет передан в файл или наустройство, а во втором — поток ошибок будет добавлен в файл, если такойсуществует. При использовании переадресации 2>&1 стандартный потокошибок будет перенаправлен на стандартный вывод интерпретатора Bourne(здесь 1 и 2 — дескрипторы файлов). Для перенаправления стандартногопотока ошибок в файл вы можете также использовать переадресацию >&имя_файла (интерпретатор C-Shell).В командных интерпретаторах Когп и C-Shell можно использовать переадресацию >! имя_файла.
При этом файл не будет перезаписан, если онсуществует.Символ | используется для перенаправления стандартного вывода однойпрограммы на стандартный ввод другой. Например, ps -ax | grep httpd.Можно также использовать переадресацию |&. В этом случае стандартный поток ошибок будет передан по каналу другой команде интерпретатора.5.3. Команды управления процессамиКоманда psКоманда ps предназначена для вывода информации о выполняемых втекущий момент процессах. Данная команда имеет много параметров, окоторых вы можете прочитать в руководстве (man ps). Здесь я опишу лишьнаиболее часто используемые мною (см.
табл. 5.2).141ПроцессыПараметры программы psПараметр-а-е-t список_терминалов-и идентификаторы_пользователей-д идентификаторы_групп-XТаблица 5.2ОписаниеОтобразить все процессы, связанные с терминалом(отображаются процессы всех пользователей)Отобразить все процессыОтобразить процессы, связанные с указанными терминаламиОтобразить процессы, связанные с данными идентификаторамиОтобразить процессы, связанные с данными идентификаторами группОтобразить все процессы, не связанные с терминаломНапример, после ввода команды ps -а вы увидите примерно следующее:PID TTY1007 t t y l1036 tty21424 ttyl1447 pts/02 3 0 9 tty2TIME CMD0 0 : 0 0 : 0 0 bash0 0 : 0 0 : 0 0 bash0 0 : 0 0 : 0 2 me0 0 : 0 0 : 0 2 mpg!230 0 : 0 0 : 0 0 psДля вывода информации о конкретном процессе вы можете воспользоваться командой:# ps -ax | grep httpdS 0:01 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A698 71261 7 S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A1262 7 S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A1263 9 S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A1264 9 S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A1268 7 S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_AS 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A1269 •>7S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A12701271 9 S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A1272 7 S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A1273 7 S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A1280 9 S 0:00 httpd -DHAVE_PHP4 -DHAVEJPROXY -DHAVE ACCESS -DHAVE AВ приведенном выше примере используется перенаправлениеввода/вывода между программами ps и grep, в результате чего будет отображена информация обо всех процессах, содержащих в строке запуска «httpd».Данную команду (ps -ax | grep httpd) я написал только лишь в демонстрационных целях -- гораздо проще использовать параметр -С программы psвместо перенаправления ввода/вывода и параметр -е вместо -ах.Команда topЭта команда предназначена для вывода информации о процессах вреальном времени.
Процессы сортируются по максимальному занимаемомупроцессорному времени, но вы можете изменить порядок сортировки (см.man top). Команда также сообщает о свободных системных ресурсах.142Процессы# top7:49pm up 5 min, 2 users, load average: 0.03, 0.20, 0.1156 processes: 55 sleeping, 1 running, 0 zombie, 0 stoppedCPU states: 7.6% user, 9.8% system, 0.0% nice, 82.5% idleMem 130660K av, 94652K used, 36008K free, OK shrd, 5220K buffSwap:72256K av, OK used,72256K free60704K cachedPID USER PRI N1 SIZE RSS SHARE STAT %CPU %MEM TIME COMMANDз7 root 14R0 892 892 6802 .80.6 0:00 top1 root 00 468 468 404S0 .00.3 0:06 init2 root 00 00SW00 .00.0 0:00kflushd'3 root 00 000sw0 ,00;00:00kupdate4 root 00 000sw0 .00.0 0:00kswapdПросмотреть информацию об оперативной памяти вы можете с помощью команды free, а о дисковой — с помощью команды df.