act.sa_flags |= SA_RESTART; /* Разрешить повторный запуск */
ret = sigaction(sig, &act, NULL);
/* Поместить новые установки на место */
return ret; /* Вернуть результат */
}
В случае успеха возвращаемое значение равно 0 и -1 при ошибке.
10.6.7. Передача сигналов: kill()
killpg()
Традиционная функция Unix для передачи сигналов называется kill()
killpg()
посылает сигнал определенной группе процессов. Объявления следующие:#include
#include
int kill(pid_t pid, int sig);
int killpg(int pgrp, int sig); /* XSI */
Аргумент sig
kill()
возвращает 0 в случае успеха и -1 при ошибке; errno
указывает на проблему.Правила для значения pid
pid > 0
pid
является номером процесса, и сигнал посылается этому процессуpid = 0
pid = -1
init
(PID 1), но у других систем могут быть другие специальные процессы.pid < -1
pid
. Таким образом, вы можете отправить сигнал всей группе процессов, дублируя возможности killpg()
. Эта неортогональность обеспечивает историческую совместимость.Значение pid
kill()
сходно со значением для waitpid()
(см. раздел 9.1.6.1 «Использование функций POSIX: wait()
и waitpid()
»).Стандартная функция С raise()
int raise(int sig) {
return kill(getpid(), sig);
}
Комитет по стандартизации С выбрал имя raise()
kill()
была сочтена специфичной для Unix функцией. Представилась также возможность дать этой функции более описательное имя.killpg()
pgrp
превышает 1, эта функция эквивалентна 'kill(-pgrp, sig)
'. Справочная страница GNU/Linux pgrp
равно 0, сигнал посылается группе отправляющего процесса (Это то же самое, что и kill()
.)Как вы могли представить, нельзя послать сигнал произвольному процессу (если вы не являетесь суперпользователем, root
Однако SIGCONT
10.6.8. Наша история до настоящего времени, эпизод II
System V Release 3 API был предназначен для исправления различных проблем, представленных первоначальным API сигналов V7. В частности, важной дополнительной концепцией является понятие о блокировке сигналов.
Однако, этот API оказался недостаточным, поскольку он работал лишь с одним сигналом за раз, оставляя множество широко открытых окон, через которые могли поступать нежелательные сигналы. POSIX API, работая
sigset_t
), решает эту проблему, закрывая окна.Первый набор функций, который мы исследовали, манипулирует значениями sigset_t
sigfillset()
, sigemptyset()
, sigaddset()
, sigdelset()
и sigismember()
.