Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сигнал.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
291 Кб
Скачать
☆

Замечания

Невозможно послать сигнал процессу с номером 1, т.е. процессу init, для которого не устанавливается обработчик сигналов. Так сделано, чтобы быть уверенным, что в случае какой-либо нештатной ситуации, работа системы не будет завершена аварийно.

POSIX 1003.1-2001 требует, чтобы kill(-1,sig) посылал sig всем процессам, которым текущий процесс может послать сигналы, за исключением возможно нескольких, определяемых реализацией системы процессов. Linux разрешает любому процессу посылать сигнал себе, но в Linux системный вызов kill(-1,sig) не посылает сигнал текущему процессу.  

История linux

В различных версиях ядра, Linux применяет разные правила, касающиеся прав доступа, которые требуются для непревилегированного процесса, чтобы посылать сигнал другому процессу. В ядрах с 1.0 по 1.2.2, сигнал может быть послан, если эффективный идентификатор пользователя, посылающего сигнал процесса совпадает с эффективным идентифкатором пользователя у процесса-получателя или реальный идентификатор пользователя, посылающего сигнал процесса совпадает с реальным идентифкатором пользователя у процесса-получателя. В ядрах с 1.2.3 по 1.3.77, сигнал может быть послан, если эффективный идентификатор пользвателя, посылающего сигнал процесса совпадает или с реальным или с эффективным идентифкатором пользователя у процесса-получателя. Текущие правила, которые соответствуют стандартам POSIX 1003.1-2001 были введены, начиная с ядра версии 1.3.78.  

Соответствие стандартам

SVr4, SVID, POSIX.1, X/OPEN, BSD 4.3, POSIX 1003.1-2001  

#include <signal.h>

#include <stdio.h>

#include <stdlib.h>

int main (int argc, char ** argv)

{

pid_t dpid;

if (argc < 2) {

fprintf (stderr, "Too few arguments\n");

return 1;

}

dpid = atoi (argv[1]);

if (kill (dpid, SIGKILL) == -1) {

fprintf (stderr, "Cannot send signal\n");

return 1;

}

return 0;

}

#include <signal.h>

#include <stdio.h>

#include <stdlib.h>

int main (void)

{

pid_t dpid = getpid ();

if (kill (dpid, SIGABRT) == -1) {

fprintf (stderr, "Cannot send signal\n");

return 1;

}

return 0;

}

#include <signal.h>

int raise( int sig);   // Отправить сигнал самому себе

kill(getpid(), sig); аналогично raise

killpg - функция, с помощью которой отправляется сигнал группе процессов  

Синтаксис

#include <signal.h>

int killpg(int pgrp, int sig);  

Описание

Killpg отправляет сигнал sig группе процессов pgrp. См. раздел sigaction(2) , в котором дается список сигналов. Если значение pgrp равно 0, то killpg отправляет сигнал текущей группе процессов. Процессы группы и процесс, посылающий сигнал, должны иметь один и тот же эффективный идентификатор пользователя, или процесс-отправитель должен иметь права суперпользователя. Единственное исключение из этого - сигнал продолжения SIGCONT может быть отправлен любому процессу - потомку текущего процесса.  

Возвращаемые значения

При удачном завершении возвращается 0. При ошибке возвращается -1, а переменной errno присваивается соответствующее значение.  

Найденные ошибки

EINVAL

Задан неправильный тип сигнала.

ESRCH

В группе процессов pgrp нет ни одного процесса (или такой группы не существует).

ESRCH

Номер группы процессов равен 0, но процесс-отправитель не входит ни в какую группу процессов.

EPERM

Процесс-отправитель не имеет прав супер-пользователя и один из эффективных идентификаторов пользователя процессов-получателей отличается от соответствующего идентификатора процесса-отправителя.