Книга: Архитектура операционной системы UNIX

7.2.3 Посылка сигналов процессами

7.2.3 Посылка сигналов процессами

Для посылки сигналов процессы используют системную функцию kill. Синтаксис вызова функции:

kill(pid, signum)

где в pid указывается адресат посылаемого сигнала (область действия сигнала), а в signum — номер посылаемого сигнала. Связь между значением pid и совокупностью выполняющихся процессов следующая:

• Если pid — положительное целое число, ядро посылает сигнал процессу с идентификатором pid.

• Если значение pid равно 0, сигнал посылается всем процессам, входящим в одну группу с процессом, вызвавшим функцию kill.

• Если значение pid равно -1, сигнал посылается всем процессам, у которых реальный код идентификации пользователя совпадает с тем, под которым исполняется процесс, вызвавший функцию kill (об этих кодах более подробно см. в разделе 7.6). Если процесс, пославший сигнал, исполняется под кодом идентификации суперпользователя, сигнал рассылается всем процессам, кроме процессов с идентификаторами 0 и 1.

• Если pid — отрицательное целое число, но не -1, сигнал посылается всем процессам, входящим в группу с номером, равным абсолютному значению pid.

Во всех случаях, если процесс, пославший сигнал, исполняется под кодом идентификации пользователя, не являющегося суперпользователем, или если коды идентификации пользователя (реальный и исполнительный) у этого процесса не совпадают с соответствующими кодами процесса, принимающего сигнал, kill завершается неудачно.

В программе, приведенной на Рисунке 7.13, главный процесс сбрасывает установленное ранее значение номера группы и порождает 10 новых процессов. При рождении каждый процесс-потомок наследует номер группы процессов своего родителя, однако, процессы, созданные в нечетных итерациях цикла, сбрасывают это значение. Системные функции getpid и getpgrp возвращают значения кода идентификации выполняемого процесса и номера группы, в которую он входит, а функция pause приостанавливает выполнение процесса до момента получения сигнала. В конечном итоге родительский процесс запускает функцию kill и посылает сигнал о прерывании всем процессам, входящим в одну с ним группу. Ядро посылает сигнал пяти «четным» процессам, не сбросившим унаследованное значение номера группы, при этом пять «нечетных» процессов продолжают свое выполнение.

#include ‹signal.h›
main() {
 register int i;
 setpgrp();
 for (i = 0; i ‹ 10; i++)  {
  if (fork() == 0)   {
   /* порожденный процесс */
   if (i & 1) setpgrp();
   printf("pid = %d pgrp = %dn", getpid(), getpgrp());
   pause(); /* системная функция приостанова выполнения */
  }
 }
 kill(0, SIGINT);
}

Рисунок 7.13. Пример использования функции setpgrp

Оглавление книги


Генерация: 1.657. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз