Сигналы
Сигналы
За многими сигналами закреплены специальные функции.
signal.h - соответствуетсигналу мнемокоду
#define SIGHUP 15
SIGHUP (Hang Up) опускание трубки телефона , заверш. управл. процесс
SIGINT (Interact) Ctrl+C прерывание с клавиатуры
QUIT- выход
ILL – неверная инструкция
FPE – деление на 0
Рекомендуемые материалы
KILL – нельзя обработать процессом
SEGV – нарушение сегментации
PIPE – возникновение проблем в конвейере
ALRM – сигнал будильника
TERM – один из основных сигналов для завершения процесса
USR1 – не закреплены никакие функции
USR2 – можно определить самому
CHLD – порожденный процесс завершился
STOP – не обрабатывается процессами
CONT - продолжение
PWR – нет напряжения в сети
dd – снимает образы CD/DVD
dd if = /dev/cdrom of = /dev/hda2
ps – номер процесса
dd – обраб. сигн. USR1 USR2
kill посылает сигналы. Соответствует вызову:
kill (<номер процесса> <номер сигнала>)
Если задавать сигнал в форме SIG…, необходимо подключить signal.h
Сигналы обрабатываются асинхронно. Обработчик сигнала устанавливается с помощью вызова:
signal (<номер сигнала>,<обработчик>)
SIG_INT SIG_DFL указатель на функцию
(игнорирование) (по умолчанию)
Функция – обработчик:
void <имя> (int <номер сигнала>)
Пример:
#include <signal.h>
#include <stdio.h>
void obr (int n)
{ printf (‘%d’,n);
fflush (stdout);} // чистит буфер вывода, чтобы выводил сразу
main ()
{ signal(SIGUSR2, obr);
while (1);}
// kill – SIGUSR2 <номер процесса>
// while (1); - грузит ЦП, поэтому
while (1); pause;
// БУДИЛЬНИК
wakeup ()
{ printf (“Я проснулся”);
fflush (stdout);}
main ()
{ signal (SIGALRM, wakeup);
while (1)
{alarm (5); // сигнал будильника с задержкой на 5 секунд
pause();
}}
// вместо alarm(5) имитация его kill
kill (getpid(),SIGALRM); //возвращает номер процесса
wakeup ()
{ printf (‘умираю’);
exit(0);
}
wakeup1 ()
{ printf (‘успел’);
wait(0);
}
main ()
{ char buf [16];
int nch, inp; // номер порожд. процесса, дескриптор файла
signal (SIGALRM, wakeup);
signal (SIGCHLD, wakeup1);
if (nch = fork()) // родительский
{ sleep(1);
kill (nch, SIGALRM);
}
Если Вам понравилась эта лекция, то понравится и эта - 4.2. Структура и типы команд.
else // потомок
{ inp = open (“/dev/tty”, )_RDOHLY);
read (inp, buf, sizeof (buf));
}}
sigation – лучший вариант, чем signal
sigprocmask – можно задавать номер сигнала, который будут игнорировать