- •Синтаксис
- •Описание
- •Возвращаемые значения
- •Найденные ошибки
- •Соответствие стандартам
- •Описание
- •Возвращаемое значение
- •Соответствие стандартам
- •Синтаксис
- •Описание
- •Возвращаемые значения
- •Найденные ошибки
- •Замечания
- •История linux
- •Соответствие стандартам
- •Наборы сигналов
- •Блокировка сигналов
- •Возвращаемые значения
- •Найденные ошибки
- •Замечания
- •Найденные ошибки
- •Синтаксис
- •Описание
Замечания
Невозможно послать сигнал процессу с номером 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
Процесс-отправитель не имеет прав супер-пользователя и один из эффективных идентификаторов пользователя процессов-получателей отличается от соответствующего идентификатора процесса-отправителя.
