Изучение основных принципов управления процессами и нитями в ОС LINUX, страница 5

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