|
Программирование >> Структура ядра и системные вызовы
execjcmd для создания отдельного порожденного процесса, который будет выполнять сложные команды в другом контексте. Процесс вторичного shell ожидает завершения нового порожденного процесса, а затем обрабатывает следующий объект CMD INFO (если в текущем объекте не установлен флаг CMDJNFOr.background). Последнее означает, что новый порожденный процесс следует запускать в фоновом режиме, а процесс вторичного shell не будет вызывать waitpid для нового порожденного процесса. Если указатель CMD INFO::Pipe объекта CMD INFO - не NULL, процесс выполняет команду ввода-вывода в канал, а процесс вторичного shell вызывает функцию exec pipe для создания неименованных каналов и выполнения соответствующих команд новыми порожденными процессами. Вот функция main программы minishell: /* shell.с: основная программа minishell */ ♦include <iostream.h> finclude <stdio.h> extern C int yyparseO; extern FILE* yyin; int main(int argc, char* argv[]) if (argc > 1) while (-argc > 0) if (yyin=fopen(*++argv, r )), yyparseO; else cerr Cant open file: *argv endl; else yyparse 0; return 0; Функция main вызовет функцию yyparse для синтаксического анализа потока ввода. Функция yyparse определяется в фа11пе y.tab.h. Поток ввода программы minishell может быть связан со стандартным вводом, если у программы нет аргумента командной строки (следовательно, значение argc будет равно 1), либо с одним или несколькими текстовыми файлами (сценариями shell), которые специально указываются пользователем во время вызова программы. В последнем слу1гае функция main открывает каждый файл сценария и дает функции yyparse указание читать данные из этого файла посредством глобального указателя потока yyin. Программа minishell может быть скомпилирована следующим образом: % уасс -d shell.y #создание файлов у.tab.с и y.tab.h %, lex shell.1 fсоздание файла lex.yy.c % CC -о shell shell.С exec cmd.C lex.yy.c y.,tab.c Пробное вьшолнение этой программы обеспечивает результат, приведенный ниже (команды, вводимые пользователем, даны курсивом, результаты выполнения программы minishell - обычным шрифтом): % shell date Sat May 10 11:53:03 PDT 1997 cat -n /etc/motd Welcome to T.J.Systems Is -1 I cat -n I sort -r I wc 10 93 635 pwd; date; Is I wc; ps /home/terry/test1 Sat May 10 11:53:03 PDT 1997 9 9 69 TIME COMD 0:00 shell 0:00csh 0:00shell 0:01ps I cat -n I sort -r PID 351 269 341 356 pts/2 pts/2 pts/2 pts/2 pwd &; (Is -1 /home/terry/testl 11 103 700 CJs -J I cat -n I sort -r I wc; pwdh &; date Sat May 10 11:53:03 PDT 1997 11 103 700 /home/terry/testl wc) > xyz; cat xyz 8.6. Заключение в этой главе описаны API операционной системы UNIX и стандарта POSIX, предназначенные для создания процессов, управления ими, обеспечения связи между родительскими и порожденными процессами, запроса и изменения атрибутов процессов. Кроме того, продемонстрированы методы, применяемые для изменения стандартного ввода и вывода процессов, установления командных каналов и выполнения команд shell в пользовательской программе. В конце приведен пример программы minishell, являющейся упрощенной программой shell ОС UNIX, в которой используются все описанные в этой главе API и проиллюстрированы способы их применения. Важным аспектом управления процессами является обработка сигналов, которая осуществляется в ходе взаимодействии между процессом и ядром операционной системы при управлении асинхронными событиями. Это - основная тема следующей главы. ГЛАВА Сигаалы Сигналы инициируются событиями и посылаются в процесс для уведомления его о том, что произошло нечто неординарное, требуюшее определенного действия. Событие может вызываться процессом, пользователем или ядром UNIX. Например, если процесс попытается выполнить математическую операцию деление на нуль или разыменовать NULL-указатель, ядро пошлет такому процессу сигнал, который прервет его. Если пользователь нажмет клавишу [Delete] или комбинацию клавиш [CtrH-C], ядро с помошью сигнала прервет приоритетный (foreground) процесс. Наконец, родительский процесс и порожденные процессы могут посылать друг другу сигналы для синхронизации. Таким образом, сигналы являются программной версией аппаратных прерываний. Точно так же, как в любой системе есть несколько уровней аппаратных прерываний, определены и различные типы сигналов для разных событий, которые могут происходить в UNIX-системе. Сигналы определяются как флаги, принимающие целочисленные значения. Список сигналов, используемых в UNIX-системах, содержится в заголовке <signal.h>. Имя Ситуация, в которой генерируется сигнала сигнал Создается ли по умолчанию
Глава 9. Сигналы
Посланный в процесс сигнал обрабатывается. Процесс может отреагировать на ожидающий обработки сигнал одним из трех способов: Выполнить действие, предусмотренное по умолчанию. Для большинства сигналов это означает завершение процесса. Проигнорировать сигнал. Сигнал отбрасывается и никакого эффекта на процесс-получатель не оказывает. Вызвать функцию, определенную пользователем. Эту функцию называют программой-обработчиком сигналов. Когда такая функция вызывается, говорят, что сигнал перехватывается. Если эта функция заканчивает свое выполнение без завершения процесса, то процесс продолжает выполняться с той точки, на которой он был прерван сигналом. Процесс может создавать для каждого сигнала индивидуальный механизм обработки. Например, одни сигналы он может игнорировать, некоторые перехватывать, а с остальными выполнять действие, предусмотренное i умолчанию. Более того, в ходе выполнения процесс может изменять принщ обработки определенных сигналов. Например, вначале сигнал может игн1 рироваться, затем устанавливаться на перехват, а после этого - на выпо. нение действия по умолчанию. Если процесс-получатель отреагировал i сигнал, то говорят, что сигнал доставлен. Стандартным действием для большинства сигналов является завершена процесса-получателя (исключение - сигналы SIGCHLD и SIGPWR). Нек( торые сигналы генерируют для преждевременно завершенного процесс файл с именем core, содержащий образ процесса,- чтобы пользовател могли проанализировать его состояние. Эти сигналы обычно генерируютс при наличии в прекращенном процессе неявной программной ошибки, частности, сигнал SIGSEGV генерируется, когда процесс пытается разыме новать NULL-указатель. Если процесс принимает стандартное действи этого сигнала, то после прекращения процесса создается файл core, помощью которого пользователь может отладить программу. Большинство сигналов можно игнорировать и перехватывать, за исклю чением сигналов SIGKILL и SIGSTOP. Сигнал SIGKILL может генериро ваться пользователем при работе в shell с помощью команды kill-9 <Ш процесса: Сигнал SIGSTOP останавливает выполнение процесса. Например, есл) пользователь введет с клавиатуры комбинацию клавиш [Ctrl+Z], ядро по шлет в приоритетный процесс сигнал SIGSTOP, который остановит его Дополняющий сигнал для SIGSTOP - сигнал SIGCONT, который возоб новляет выполнение процесса после остановки. Сигналы SIGSTOP и SIG CONT используются в ОС UNIX для управления выполнением заданий. Процессу, чтобы он не прерывался во время выполнения ответственны; задач, разрешается игнорировать определенные сигналы. Например, когд< процесс управления базой данных обновляет файл базы данных, его нельз$ прерывать, пока он сам не завершится, иначе этот файл будет поврежден Поэтому перед обновлением файла данный процесс должен указать, что все основные сигналы прерываний (т.е. SIGINT и SIGTERM) необходимо игнорировать. После обработки файла он должен восстановить порядок обработки сигналов. Поскольку большинство сигналов выдается в процесс асинхронно, процесс может указать для каждого из них отдельную функцию-обработчик. Такие функции вызываются, когда перехватываются соответствующие сигналы. Одно из типичных для них действий - очистка рабочей среды процесса (в частности, закрытие всех входных и выходных файлов) перед плавным его завершением. 9.1. Поддержка сигналов ядром ОС UNIX в UNIX System V.3 каждая запись таблицы процессов ядра содержит массив сигнальных флагов, по одному для каждого сигнала, определенного в системе. Когда для процесса генерируется сигнал, ядро устанавливает в
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |