10 BUS Bus error 38 38 signal 38
11 SEGV Memory fault 39 39 signal 39
12 SYS Bad system call 40 40 signal 40
13 PIPE Broken pipe 41 41 rtsig 41
14 ALRM Alarm clock 42 42 rtsig 42
15 TERM Terminated 43 43 rtsig 43
16 USR1 User defined signal 1 44 44 rtsig 44
17 USR2 User defined signal 2 45 45 rtsig 45
18 CHLD Child exited 46 46 rtsig 46
19 PWR Power-fail/Restart 47 47 rtsig 47
20 WINCH Window size change 48 48 rtsig 48
21 URG Urgent I/O condition 49 49 rtsig 49
22 IO I/O possible 50 50 rtsig 50
23 STOP Stopped (signal) 51 51 rtsig 51
24 TSTP Stopped 52 52 rtsig 52
25 CONT Continued 53 53 rtsig 53
26 TTIN Stopped (tty input) 54 54 rtsig 54
27 TTOU Stopped (tty output) 55 55 rtsig 55
28 VTALRM Virtual timer expired 56 56 rtsig 56
Void ( * signal (int sig, void (* func)(int)))
Функция системного вызова signal заключается в том, чтобы задать определенные действия для программы в ответ на пришедший сигнал. В качестве действий можно задать следующие значения: SIG_DFL, SIG_IGN или указатель на собственную функцию обработки.
SIG_DFL означает, что процесс должен реагировать на сигнал, как задано по умолчанию (чаще всего это завершение процесса), SIG_IGN (нельзя задать для SIGSTOP и SIGKILL) означает, что нужно игнорировать сигнал.
Текст программы son1.c (реакция по умолчанию).
#include <signal.h>
main ()
{
signal(SIGUSR1, SIG_DFL);
sleep (10);
}
Текст программы son2.c (игнорирование).
#include <signal.h>
main ()
{
signal (SIGUSR1, SIG_IGN);
sleep (10);
}
Текст программы son3.c (своя обработка).
#include <signal.h>
void SIGUSR1_handler (int sig_no)
{
printf ("SIGUSR1_handler running!\n");
}
main ()
{
signal (SIGUSR1, SIGUSR1_handler);
sleep(10);
}
Текст программы father.c (родительский процесс).
#include <signal.h>
#include <stdio.h>
main ()
{
int pid1,pid2,pid3;
pid1=fork();
if (pid1==0)
execl("son1.out","son1.out",NULL);
pid2=fork();
if (pid2==0)
execl("son2.out","son2.out",NULL);
pid3=fork();
if (pid3==0)
execl("son3.out","son3.out",NULL);
system("echo before signal sent");
system("ps -l");
kill (pid1, SIGUSR1);
kill (pid2, SIGUSR1);
kill (pid3, SIGUSR1);
system("echo after signal sent");
system("ps -l");
}
Результаты выполнения.
$ ./father.out
before signal sent
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
00000210 - 100 450581 368671 - 10 0 - 4612K - ? 00:00:01 helpviewer
...
00000000 - 100 716845 491559 - 10 0 - 636K - ? 00:00:00 father.out
00000000 - 100 720942 716845 - 10 0 - 636K - ? 00:00:00 son1.out
00000000 - 100 720943 716845 - 10 0 - 636K - ? 00:00:00 son2.out
00000000 - 100 737328 716845 - 10 0 - 844K - ? 00:00:00 sh
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.