Если вы хотите отправить сигнал не текущей приоритетной задаче, а другому процессу, используйте команду kill
$ kill -HUP 512
Удобный вариант команды kill
killall, которая позволяет отправить сигнал всем процессам, выполняющим конкретную команду. Не все системы UNIX поддерживают ее, но ОС Linux, как правило, поддерживает. Этот вариант полезен, когда вы не знаете PID процесса или хотите отправить сигнал нескольким разным процессам, выполняющим одну и ту же команду. Обычное применение — заставить программу inetd перечитать параметры настройки. Для этого можно воспользоваться следующей командой:$ killall -HUP inetd
Программы могут обрабатывать сигналы с помощью библиотечной функции signal
#include
void (*signal(int sig, void (*func)(int)))(int);
Это довольно сложное объявление говорит о том, что signal
sig и func. Сигнал, который нужно перехватить или игнорировать, задается аргументом sig. Функция, которую следует вызвать при получении заданного сигнала, содержится в аргументе func. Эта функция должна принимать единственный аргумент типа int (принятый сигнал) и иметь тип void. Функция сигнала возвращает функцию того же типа, которая является предыдущим значением функции, заданной для обработки сигнала, или одно из двух специальных значений:SIG_IGN
SIG_DFL
Пример сделает все понятным. В упражнении 11.7 вы напишете программу ctrlc.c, которая реагирует на нажатие комбинации клавиш
Функция ouch
sig. Эта функция будет вызываться, когда возникнет сигнал. Она выводит сообщение и затем восстанавливает обработку сигнала по умолчанию для сигнала SIGINT (генерируется при нажатии комбинации клавиш #include
#include
#include
void ouch(int sig) {
printf("OUCH! - I got signal %d\n", sig);
(void)signal(SIGINT, SIG_DFL);
}
Функция main
SIGINT, генерируемым при нажатии комбинации клавиш int main {
(void)signal(SIGINT, ouch);
while(1) {
printf("Hello World!\n");
sleep(1);
}
}
Ввод комбинации клавиш ^C
SIGINT$ ./ctrlcl
Hello World!
Hello World!
Hello World!
Hello World!
^C
OUCH! - I got signal 2
Hello World!
Hello World!
Hello World!
Hello World!
^C
$
Как видно из данного примера, функция обработки сигнала принимает один целочисленный параметр — номер сигнала, приводящий к вызову функции. Это удобно, если одна и та же функция применяется для обработки нескольких сигналов. В данном случае вы выводите значение SIGINT