А. Робачевский - Операционная система UNIX (1114671), страница 31
Текст из файла (страница 31)
Среда программирования UNIXложения. В частности, большинство серверов, одновременно обслужи!вающих несколько запросов, организованы именно таким образом: припоступлении запроса порождается процесс, который и выполняет необхо!димую обработку. Родительский процесс является своего рода супервизо!ром, принимающим запросы и распределяющим их выполнение. Очевид!ным недостатком такого подхода является то, что вся функциональностьпо!прежнему заложена в одном исполняемом файле и, таким образом, огра!ничена.UNIX предлагает системный вызов, предназначенный исключительно длязапуска программ, т. е. загрузки другого исполняемого файла.
Это систем!ный вызовпредставленный на программном уровне несколькимимодификациями:intintintintintint(const charconst char *argO,const char *argn, char *charcharexecle (const charargO [const charchar *charexecve (const charcharargv [charexeclp (const char *file, const char *argO,const char *argn, char *execvp (const char *file, char *const,Все эти функции по существу являются надстройками системного вызоваexecve(2), который в качестве аргументов получает имя запускаемой про!граммы (исполняемого файла), набор аргументов и список переменныхокружения. После выполненияне создается новый процесс, аобраз существующего полностью заменяется на образ, полученный из ука!занного исполняемого файла.
На рис. 2.12 показано, как связаны междусобой приведенные выше функции.В отличие отfork(2), новая программа наследует меньше атрибутов.В частности, наследуются:идентификаторы процесса PID и PPID,идентификаторы пользователя и группы,эффективные идентификаторы пользователя и группы (в случае, ес!ли для исполняемого файла не установлен флаг SUID или SGID),Пограничения, накладываемые на процесс,Отекущий и корневой каталоги,Пмаска создания файлов,Пуправляющий терминал,файловыедескрипторы,длякоторыхнеустановленфлагFD CLOEXEC.www.books-shop.comПроцессы157Рис.
2.12. Семейство функций ехес(2)Наследование характеристик процесса играет существенную роль в работеоперационной системы. Так наследование идентификаторов владельцевпроцесса гарантирует преемственность привилегий и, таким образом, неиз!менность привилегий пользователя при работе в UNIX. Наследование фай!ловых дескрипторов позволяет установить направления ввода/вывода длянового процесса или новой программы.
Именно так действует командныйинтерпретатор. Мы вернемся к вопросу о наследовании в главе 3.В главе 1 уже говорилось о частом объединении вызовови ехес(2),получившем специальное названиеТаким образом загружает!ся подавляющее большинство программ, которые выполняются в системе.www.books-shop.comГлава 2.программированияПри порождении процесса, который впоследствии может загрузить новуюпрограмму, "родителю" может быть небезынтересно узнать о завершениивыполнения "потомка". Например, после того как запущена утилита ls(l),командный интерпретатор приостанавливает свое выполнение до заверше!ния работы утилиты и только после этого выдает свое приглашение на эк!ран. Можно привести еще множество ситуаций, когда процессам необходи!мо синхронизировать свое выполнение с выполнением других процессов.из способов такой синхронизации является обработка родителемсигналаотправляемого ему при "смерти" потомка.
Механизм сиг!налов мы рассмотрим в следующем разделе. Сейчас же остановимся на дру!гом подходе.Операционная система предоставляет процессу ряд функций, позволяю!щих ему контролировать выполнение потомков. Это функциии<sys/wait.h>pid_tidtype, id_t id,int options);pid, int *stat_loc, intПервый из этих вызововобладает самой ограниченной функцио!нальностью — он позволяет заблокировать выполнение процесса, покакто!либо из его непосредственных потомков не прекратит существование.Вызовнемедленно возвратит состояние уже завершившегося дочер!процесса в переменной stat_loc, если последний находится в со!стоянии зомби.
Значение s t a t _ l o c может быть проанализировано с по!мощью следующих макроопределений:Возвращает истинное (ненулевое) значение, если про%цесс завершился нормально.Если WIFEXITED(status) не равно нулю, определяет кодвозврата завершившегося процесса (аргумент функ%цииВозвращает истину, если процесс завершился по сиг%налу.Если WIFSIGNALLED(status) не равно нулю, определя%ет номер сигнала, вызвавшего завершение выполне%ния процесса.Если WIFSIGNALLED(status) не равно нулю, макросвозвращает истину в случае создания файла core.Системный вызовпредоставляет больше возможностей для кон!троля дочернего процесса. Аргументы idtype и id определяют, за какимиизпроцессов требуется следить:www.books-shop.com/59ПроцессыЗначение аргумен[та idtypeОписаниеблокирует выполнение процесса, следя за потом%ком, PID которого равен id.waitid(2) блокирует выполнение процесса, следя за потом%ками, идентификаторы группы которых равны id.P_ALLблокирует выполнение процесса, следя за всеминепосредственными потомками.Аргумент options содержит флаги, объединенные логическим И Л И , оп!ределяющие, за какими изменениями в состоянии потомков следитФлаги аргументаoptionsОписаниеПредписывает ожидать завершения выполнения процесса.Предписывает ожидать ловушки (trap) или точки останова(breakpoint) для трассируемых процессов.Предписывает ожидать останова процесса из%за получе%ния сигнала.Предписывает вернуть статус процесса, выполнение кото%рого было продолжено после останова.Предписывает завершить свое выполнение, если отсутст%вует статусная информация (т.
е. отсутствует ожидаемоесобытие).Предписывает получить статусную информацию, но неуничтожать ее, оставив дочерний процесс в состоянииожидания.Аргумент infop указывает на структуру siginfo_t, которая будет запол!нена информацией о потомке. Мы рассмотрим эту структуру в следующемразделе.Функциякак и функцииипозволяет контроли!ровать определенное множество дочерних процессов.В заключение для иллюстрации описанных в этом разделе системных вы!зовов приведем схему работы командного интерпретатора при запуске ко!манды.приглашение/*Считать пользовательскийgetȾɚɧɧɚɹɜɟɪɫɢɹɤɧɢɝɢɜɵɩɭɳɟɧɚɷɥɟɤɬɪɨɧɧɵɦɢɡɞɚɬɟɥɶɫɬɜɨɦ%RRNVVKRSɊɚɫɩɪɨɫɬɪɚɧɟɧɢɟɩɪɨɞɚɠɚɩɟɪɟɡɚɩɢɫɶɞɚɧɧɨɣɤɧɢɝɢɢɥɢɟɟɱɚɫɬɟɣɁȺɉɊȿɓȿɇɕɈɜɫɟɯɧɚɪɭɲɟɧɢɹɯɩɪɨɫɶɛɚɫɨɨɛɳɚɬɶɩɨɚɞɪɟɫɭpiracy@books-shop.com2.программирования UNIX/*Произвести разбор ввода: выделить команду and и ее аргументыand,pid =if (pid == 0){/*3апустить/*При нормальном запуске программы эта часть кода выполняться уже не будет — можно смело выводить сообщение обpexit}elseпроцесс (shell) ожидает завершения выполненияСигналыСигнал является способом передачи уведомления о некотором произо!шедшем событии между процессами или между ядром системы и процес!сами.
Сигналы можно рассматривать, как простейшую форму межпро!цессного взаимодействия, хотя на самом деле они больше напоминаютпрограммные прерывания, при которых нарушается нормальное выполне!ние процесса.Сигналы появились уже в ранних версиях UNIX, но их реализация не бы!ла достаточно надежной. Сигнал мог быть "потерян", возникали такжеопределенные сложности с отключением (блокированием) сигналов навремя выполнения критических участков кода. В последующие версиисистемы, как BSD, так и System V, были внесены изменения, позволившиереализовать надежные (reliable) сигналы. Однако модель сигналов, принятаяв версиях BSD, была несовместима с моделью версий System V.
В настоя!щее время стандарт POSIX.1 вносит определенность в интерфейс надеж!ных сигналов.Прежде всего, каждый сигнал имеет уникальное символьное имя и соот!ветствующий ему номер. Например, сигнал прерывания, посылаемый про!цессу при нажатии пользователем клавиши <Del> или <Ctrl>+<C>, имеетимя S I G I N T . Сигнал, генерируемый комбинацией <Ctrl>+<\>, называетсяСедьмая редакция UNIX насчитывала 15 различных сигналов, ав современных версиях их число увеличилось вдвое.Сигнал может быть отправлен процессу либо ядром, либо другим процес!сом с помощью системного вызоваttinclude<signal.h>intt pid,intwww.books-shop.comПроцессыАргументадресует процесс, которому посылается сигнал.
Аргументопределяет тип отправляемого сигнала.К генерации сигнала могут привести различные ситуации:Ядро отправляет процессу (или группе процессов) сигнал при нажа!тии пользователем определенных клавиш или их комбинаций. На!пример, нажатие клавиши <Del> (илиприведет к от!правке сигнала SIGINT, что используется для завершения процессов,вышедших из!подАппаратные особые ситуации, например, деление на 0, обращение кнедопустимой области памяти и т.
д., также вызывают генерациюсигнала. Обычно эти ситуации определяются аппаратурой компью!тера, и ядру посылается соответствующее уведомление (например, ввиде прерывания). Ядро реагирует на это отправкой соответствую!щего сигнала процессу, который находился в стадии выполнения,когда произошла особая ситуация.П Определенные программные состояния системы или ее компонентовтакже могут вызвать отправку сигнала. В отличие от предыдущегослучая, эти условия не связаны с аппаратной частью, а имеют чистопрограммный характер.
В качестве примера можно привести сигналSIGALRM, отправляемый процессу, когда срабатывает таймер, ранееустановленный с помощью вызоваС помощью системного вызова kill(2) процесс может послать сигнал каксамому себе, так и другому процессу или группе процессов. В этом случаепроцесс, посылающий сигнал, должен иметь те же реальный и эффектив!ный идентификаторы, что и процесс, которому сигнал отправляется. Разу!меется, данное ограничение не распространяется на процессы, обладаю!щие привилегиями суперпользователя.
Такие процессы имеют возмож!ность отправлять сигналы любым процессам системы.Как уже говорилось в предыдущей главе, процесс может выбрать одно изтрех возможных действий при получении сигнала:П игнорировать сигнал,П перехватить и самостоятельно обработатьП позволить действие по умолчанию.Текущее действие при получении сигнала называется диспозицией сигнала.Напомним, что сигналыи SIGSTOP невозможно ни игнориро!вать, ни перехватить. Сигнал SIGKILL является силовым методом завер!шения выполнения "непослушного" процесса, а от работоспособностиSIGSTOP зависит функционирование системы управления заданиями.Сигналы этого рода генерируютсятерминала.
Настройка терминального драй!вера позволяет связать условие генерации сигнала с любой клавишей.www.books-shop.comГлава 2. Среда программирования UNIXУсловия генерации сигнала и действие системы по умолчанию приведеныв табл. 2.18. Как видно из таблицы, при получении сигнала в большинствеслучаев по умолчанию происходит завершение выполнения процесса. Вслучаев в текущем рабочем каталоге процесса также создается файлcore (в таблице такие случаи отмечены какв которомхранится образ памяти процесса. Этот файл может быть впоследствии про!анализирован программой!отладчиком длясостояния процес!са непосредственно перед завершением. Файл core не будет создан в сле!случаях:исполняемый файл процесса имеет установленный бити ре!альный владелец!пользователь процесса не является владельцем!пользователем исполняемого файла;Оисполняемый файл процесса имеет установленный бит SGID, и ре!альный владелец!группа процесса не является владельцем!группойисполняемого файла;Ппроцесс не имеет права записи в текущем рабочем каталоге;Dразмер файла core слишком велик (превышает допустимый пределсм.