161
Говорят, что сигнал генерируется (или посылается) для процесса (потока управления), когда происходит вызвавшее его событие:
•выявлен аппаратный сбой;
•отработал таймер;
•пользователь ввел с терминала специальную последовательность символов;
•процесс обратился к функции kill(...) и другие.
Иногда, по одному событию генерируются сигналы для нескольких процессов, например, для группы процессов, ассоциированных с некоторым управляющим терминалом.
Вмомент генерации сигнала определяется, посылается ли он:
•процессу, когда генерация его ассоциирована с идентификатором процесса
или группы процессов, а также с асинхронным событием, например, с пользовательским вводом с терминала; в каждом процессе определены действия, предпринимаемые в ответ на все предусмотренные системой сигналы;
•конкретному потоку управления в процессе, когда сигналы, сгенерированны
в результате действий, приписываемых отдельному потоку управления, например, такому как возникновение аппаратной исключительной ситуации.
Говорят, что:
•сигнал доставлен процессу, когда взято для выполнения действие, соответствующее конкретному процессу и сигналу;
•сигнал принят процессом, когда он выбран и возвращен одной из функций sigwait(...).
Винтервале, от генерации до доставки или принятия сигнал называется ждущим. Обычно, он невидим для приложений, однако доставку сигнала потоку управления можно блокировать.
Если действие, ассоциированное с заблокированным сигналом, отлично от игнорирования, он будет ждать разблокирования.
У каждого потока управления есть маска сигналов, определяющая набор блокируемых сигналов. Обычно она достается в наследство от родительского потока.
Ссигналом могут быть ассоциированы действия одного из трех типов:
•SIG_DFL — выполняются подразумеваемые действия, зависящие от сигнала, которые описаны в заголовочном файле <signal.h>;
•SIG_IGN - игнорировать сигнал. Доставка сигнала не оказывает воздействия на процесс;
•указатель на функцию - обработать сигнал, выполнив при его доставке за-
данную функцию. После завершения функции обработки процесс возобновляет выполнение с точки прерывания.
Обычно, функция обработки сигнала вызывается в соответствии со следующим заголовком языка C:
void func (int signo);
где signo - номер доставленного сигнала.
162
Замечание
Первоначально, до входа в функцию main(...), реакция на все сигналы установлена как
SIG_DFL или SIG_IGN.
Функция называется асинхронно-сигнально-безопасной (АСБ), если ее можно вызывать без каких-либо ограничений при обработке сигналов.
Встандарте POSIX-2001, имеется список функций, которые должны быть либо
повторно входимыми, либо непрерываемыми сигналами, что превращает их в АСБфункции.
Вэтот список включены порядка 117 функций.
Если сигнал доставляется потоку, а реакция заключается в завершении, остановке или продолжении, весь процесс должен завершиться, остановиться или продолжиться.
Сигнал процессу может быть послан:
•либо из командной строки с помощью служебной программы kill;
•либо из процесса с помощью одноименной функции:
#include <signal.h>
int kill (pid_t pid, int sig);
Сигнал задается аргументом sig, значение которого может быть нулевым; в этом случае действия функции kill(...) сводятся к проверке допустимости значения pid. Нулевой результат - признак успешного завершения kill(...).
Если pid > 0, это значение трактуется как идентификатор процесса.
При нулевом значении pid, сигнал посылается всем процессам из той же группы, что и вызывающий.
Если значение pid равно -1, адресатами являются все процессы, которым вызывающий имеет право посылать сигналы.
При прочих отрицательных значениях pid, сигнал посылается группе процессов, чей идентификатор равен абсолютной величине pid.
Процесс имеет право послать сигнал адресату, заданному аргументом pid, если он (процесс) имеет соответствующие привилегии или его реальный или действующий UID совпадает с реальным или сохраненным UID адресата.
Вызов служебной программы kill в виде: kill -l, позволяет вывести на терминал весь список сигналов:
1) |
SIGHUP |
2) |
SIGINT |
3) |
SIGQUIT |
4) |
SIGILL |
|
5) |
SIGTRAP |
6) |
SIGABRT |
7) |
SIGBUS |
8) |
SIGFPE |
|
9) |
SIGKILL |
10) |
SIGUSR1 |
11) |
SIGSEGV |
12) |
SIGUSR2 |
|
13) |
SIGPIPE |
14) |
SIGALRM |
15) |
SIGTERM |
17) |
SIGCHLD |
|
18) |
SIGCONT |
19) |
SIGSTOP |
20) |
SIGTSTP |
21) |
SIGTTIN |
|
22) |
SIGTTOU |
23) |
SIGURG |
24) |
SIGXCPU |
25) |
SIGXFSZ |
|
26) |
SIGVTALRM |
27) |
SIGPROF |
28) |
SIGWINCH |
29) |
SIGIO |
|
30) |
SIGPWR |
31) |
SIGSYS |
32) |
SIGRTMIN |
33) |
SIGRTMIN+1 |
|
163
34) SIGRTMIN+2 35) SIGRTMIN+3 36) SIGRTMIN+4 37) SIGRTMIN+5
38) SIGRTMIN+6 39) SIGRTMIN+7 40) SIGRTMIN+8 41) SIGRTMIN+9
42) SIGRTMIN+10 43) SIGRTMIN+11 44) SIGRTMIN+12 45) SIGRTMIN+13 46) SIGRTMIN+14 47) SIGRTMIN+15 48) SIGRTMAX-15 49) SIGRTMAX-14 50) SIGRTMAX-13 51) SIGRTMAX-12 52) SIGRTMAX-11 53) SIGRTMAX-10 54) SIGRTMAX-9 55) SIGRTMAX-8 56) SIGRTMAX-7 57) SIGRTMAX-6 58) SIGRTMAX-5 59) SIGRTMAX-4 60) SIGRTMAX-3 61) SIGRTMAX-2 62) SIGRTMAX-1 63) SIGRTMAX
Стандарт языка C определяет имена всего шести сигналов: SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV и SIGTERM.
Стандарт POSIX-2001 определяет как обязательные для реализации сигналы, представленные в таблице 6.3.
Таблица 6.3 - Сигналы, определенные стандартом POSIX
Сигнал |
Описание сигнала |
SIGABRT |
Сигнал аварийного завершения процесса. Подразумеваемая реак- |
|
ция предусматривает, помимо аварийного завершения, создание |
|
файла с образом памяти процесса. |
SIGALRM |
Срабатывание будильника. Подразумеваемая реакция — аварий- |
|
ное завершение процесса. |
SIGBUS |
Ошибка системной шины как следствие обращения к неопреде- |
|
ленной области памяти. Подразумеваемая реакция — аварийное |
|
завершение и создание файла с образом памяти процесса. |
SIGCHLD |
Завершение, остановка или продолжение порожденного процес- |
|
са. Подразумеваемая реакция - игнорирование. |
SIGCONT |
Продолжение процесса, если он был остановлен. Подразу- |
|
меваемая реакция - продолжение выполнения или игнорирова- |
|
ние, если процесс не был остановлен. |
SIGFPE |
Некорректная арифметическая операция. Подразумеваемая реак- |
|
ция - аварийное завершение и создание файла с образом памяти |
|
процесса. |
SIGHUP |
Сигнал разъединения. Подразумеваемая реакция - аварийное за- |
|
вершение процесса. |
SIGILL |
Некорректная команда. Подразумеваемая реакция - аварийное за- |
|
вершение и создание файла с образом памяти процесса. |
SIGINT |
Сигнал прерывания, поступивший с терминала. |
|
Подразумеваемая реакция - аварийное завершение процесса. |
SIGKILL |
Уничтожение процесса (этот сигнал нельзя перехватить для об- |
|
работки или проигнорировать). |
|
Подразумеваемая реакция — аварийное завершение процесса. |
SIGPIPE |
Попытка записи в канал, из которого никто не читает. Под- |
|
разумеваемая реакция - аварийное завершение процесса. |
SIGQUIT |
Сигнал выхода, поступивший с терминала. Подразумеваемая ре- |
|
164 |
|
акция - аварийное завершение и создание файла с образом |
|
памяти процесса. |
SIGSEGV |
Некорректное обращение к памяти. Подразумеваемая реакция — |
|
аварийное завершение и создание файла с образом памяти про- |
|
цесса. |
SIGSTOP |
Остановка выполнения (этот сигнал нельзя перехватить для об- |
|
работки или проигнорировать). Подразумеваемая реакция — ос- |
|
тановка процесса. |
SIGTERM |
Сигнал терминирования. Подразумеваемая реакция - аварийное |
|
завершение процесса. |
SIGTSTP |
Сигнал остановки, поступивший с терминала. Подразумеваемая |
|
реакция - остановка процесса. |
SIGTTIN |
Попытка чтения из фонового процесса. Подразумеваемая |
|
реакция - остановка процесса. |
SIGTTOU |
Попытка записи из фонового процесса. Подразумеваемая |
|
реакция - остановка процесса. |
SIGUSR1, |
Определяемые пользователем сигналы. Подразумеваемая |
SIGUSR2 |
реакция - аварийное завершение процесса. |
SIGPOLL |
Опрашиваемое событие. Подразумеваемая реакция - аварийное |
|
завершение процесса. |
SIGPROF |
Срабатывание таймера профилирования. Подразумеваемая реак- |
|
ция - аварийное завершение процесса. |
SIGSYS |
Некорректный системный вызов. Подразумеваемая реакция — |
|
аварийное завершение и создание файла с образом памяти про- |
|
цесса. |
SIGTRAP |
Попадание в точку трассировки/прерывания. Подразумеваемая |
|
реакция - аварийное завершение и создание файла с образом |
|
памяти процесса. |
SIGURG |
Высокоскоростное поступление данных в сокет. |
|
Подразумеваемая реакция - игнорирование. |
SIGVTALRM |
Срабатывание виртуального таймера. Подразумеваемая реакция - |
|
аварийное завершение процесса. |
SIGXCPU |
Исчерпан лимит процессорного времени. Подразумеваемая реак- |
|
ция - аварийное завершение и создание файла с образом памяти |
|
процесса. |
SIGXFSZ |
Превышено ограничение на размер файлов. Подразумеваемая ре- |
|
акция - аварийное завершение и создание файла с образом |
|
памяти процесса. |
165
Применительно к процессам, пользователь может:
•порождать и завершать процессы;
•просматривать их состояние и изменять приоритет.
Большое прикладное значение в управлениями процессами играют сигналы.
Сигнал - это специальная и наиболее экономичная форма взаимодействия между процессами:
•сигналы имеют целочисленные номера, которые различаются процессами;
•семантика сигнала должна быть известна процессу для правильного реагирования на его получение;
•часть сигналов предназначена для обработки системой и не доходит до процесса;
•часть сигналов предназначена для обработки процессом или игнорирование
его.
Новые процессы создаются запуском сценария или исполняемого приложения.
Процессы завершаются:
•нормально - в соответствии с работой алгоритма приложения, который исполняется процессом;
•аварийно или нормально — при получении процессом сигнала;
•аварийно — при завершении процесса системой.
Для посылки сигналов процессам, используется утилита kill:
kill -сигнал PID...
Большинство сигналов предназначено для завершения работы процессов, например,
$kill -l
1) SIGHUP |
2) |
SIGINT |
3) |
SIGQUIT |
4) |
SIGILL |
5) |
SIGTRAP |
|
6) |
SIGABRT |
7) |
SIGBUS |
8) |
SIGFPE |
9) |
SIGKILL |
10) |
SIGUSR1 |
11) |
SIGSEGV |
12) |
SIGUSR2 |
13) |
SIGPIPE |
14) |
SIGALRM |
15) |
SIGTERM |
16) |
SIGSTKFLT |
17) |
SIGCHLD |
18) |
SIGCONT |
19) |
SIGSTOP |
20) |
SIGTSTP |
21) |
SIGTTIN |
22) |
SIGTTOU |
23) |
SIGURG |
24) |
SIGXCPU |
25) |
SIGXFSZ |
26) |
SIGVTALRM |
27) |
SIGPROF |
28) |
SIGWINCH |
29) |
SIGIO |
30) |
SIGPWR |
31) |
SIGSYS |
34) |
SIGRTMIN |
35) |
SIGRTMIN+1 |
36) |
SIGRTMIN+2 |
37) |
SIGRTMIN+3 |
38) |
SIGRTMIN+4 |
39) |
SIGRTMIN+5 |
40) |
SIGRTMIN+6 |
41) |
SIGRTMIN+7 |
42) |
SIGRTMIN+8 |
43) |
SIGRTMIN+9 |
44) |
SIGRTMIN+10 |
45) |
SIGRTMIN+11 |
46) |
SIGRTMIN+12 |
47) |
SIGRTMIN+13 |
48) |
SIGRTMIN+14 |
49) |
SIGRTMIN+15 |
50) |
SIGRTMAX-14 |
51) |
SIGRTMAX-13 |
52) |
SIGRTMAX-12 |
53) |
SIGRTMAX-11 |
54) |
SIGRTMAX-10 |
55) |
SIGRTMAX-9 |
56) |
SIGRTMAX-8 |
57) |
SIGRTMAX-7 |
58) |
SIGRTMAX-6 |
59) |
SIGRTMAX-5 |
60) |
SIGRTMAX-4 |
61) |
SIGRTMAX-3 |
62) |
SIGRTMAX-2 |
63) |
SIGRTMAX-1 |
64) |
SIGRTMAX |
|
|
|
|
|
|
$ |
|
|
|
|
|
|
|
|
|
где |
|
|
|
|
|
|
|
|
|
SIGUP |
Сигнал 1 - Hang UP - повешена трубка; сообщает процессу, что поль- |
||||||||
|
|
зователь, запустивший его, вышел из системы. Обычные процессы — |
|||||||
|
|
завершаются. |
|
|
|
|
|
||
SIGINT Сигнал 2 — INTerrupt — прерывание; именно этот сигнал посылается, когда пользователь нажимает клавиши Ctrl-C.