Программирование >>  Структура ядра и системные вызовы 

1 ... 39 40 41 [ 42 ] 43 44 45 ... 98


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>.

Имя Ситуация, в которой генерируется

сигнала сигнал

Создается ли по умолчанию

SIGALRM

Наступление тайм-ауга таймера сигналов. Может генерироваться API alartn()

SIGABRT

Аварийное завершение процесса. Может генерироваться API abortO

SIGFPE

Недопустимая математическая операция

SIGHUP

Разрыв связи с управляющим терминала

Глава 9. Сигналы



Имя сигнала

Ситуация, в которой генерируется сигнал

Создается ли по умолчанию файл core

SIGILL

Попытка выполнить недопустимую машинную команду

SIGINT

Прерывание процесса. Обычно генерируется клавишей [Delete] или комбинацией клавиш [Ctrl+C]

SIGKILL

Уничтожение процесса. Может генфироваться командой kill -9 <1В процесса>

SIGPIPE

Попытка выполнить недопустимую запись в канал

SIGQU1T

Выход из процесса. Обычно генерируется комбинацией клавиш [Ctrl+\]

S1GSEGV

Ошибка сегментации. Может генерироваться при разыменовании NULL-указателя

SIGTERM

Завершение процесса. Может генерироваться командой kill <1В процесса>

SIGUSR1

Зарезервирован и определяется пользователями

Нет Нет Нет

SIGUSR2

Зарезервирован и определяется пользователями

S1GCHLD

Посылается в родительский процесс при завершении порожденного процесса

SIGCONT

Возобновление остановленного процесса

SIGSTOP

Остановка процесса

SIGl UN

Остановка фонового процесса, если он пытается прочитать данные со своего управляющего терминала

SIGSTP

Остановка провдсса комбинацией клавиш [Qrl+Z]

SIGl JOU

Остановка фонового процесса, если он пьггается записать данные на свой управляющий терминал

Посланный в процесс сигнал обрабатывается. Процесс может отреагировать на ожидающий обработки сигнал одним из трех способов:

Выполнить действие, предусмотренное по умолчанию. Для большинства сигналов это означает завершение процесса.

Проигнорировать сигнал. Сигнал отбрасывается и никакого эффекта на процесс-получатель не оказывает.

Вызвать функцию, определенную пользователем. Эту функцию называют программой-обработчиком сигналов. Когда такая функция вызывается, говорят, что сигнал перехватывается. Если эта функция заканчивает свое выполнение без завершения процесса, то процесс продолжает выполняться с той точки, на которой он был прерван сигналом.

Процесс может создавать для каждого сигнала индивидуальный механизм обработки. Например, одни сигналы он может игнорировать, некоторые

перехватывать, а с остальными выполнять действие, предусмотренное 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 каждая запись таблицы процессов ядра содержит массив сигнальных флагов, по одному для каждого сигнала, определенного в системе. Когда для процесса генерируется сигнал, ядро устанавливает в



1 ... 39 40 41 [ 42 ] 43 44 45 ... 98

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика