Листинг 2.2. Программа son.c
Как видно, в процессе-потомке есть обработчики пользовательских сигналов (которые могут быть посланы другим процессом). По приходу SIGUSR1, выдается сообщение с указанием номера принятого сигнала и посылается сигнал SIGUSR2 в родительский процесс. При приходе сигнала SIGUSR2, выдается сообщение.
Сам процесс отправляет ‘папе’ сигнал USR1.
Поскольку работа происходит с верхней структурой данных, по выходу из этой программы требуется обнулить (в данном случае, выставить равным -1) значения идентификатора процесса.
Рассмотрим программу father.c
#include "header.h"
void hndl_Usr1 (int nomer) {
printf("Father: I've caught signal #%i\n",nomer);
printf("Father: my PPID = %i and PID = %i\n",si.ppid_father,si.pid_father);
};
void hndl_Usr2(int nomer) {
printf("Father: =^_^=\n");
};
int main( int argc, char* argv[] ) {
int i, pid;
if(argc < 2) {
printf("Father: not enouth input arg\n");
exit(1);
};
int count = atoi(argv[1]);
si.pid_father = getpid();
si.ppid_father = getppid();
signal(SIGUSR1,hndl_Usr1);
signal(SIGUSR2,hndl_Usr2);
signal(SIGINT,SIG_DFL);
signal(SIGCHLD,SIG_IGN);
printf("Father: creating son\n");
pid = fork();
if(!pid) {
execl("son","son",NULL,NULL);
} else {
for (i=0;i<count;i++){
pause();
};
};
printf("Father: end\n");
si.pid_father = -1;
si.ppid_father = -1;
return 0;
}
Листинг 2.3. Программа father.c
В данной реализации, обработчики сигналов выводят информацию на экран. В случае USR1 это указание на номер принятого сигнала и PID отца и текущего процесса, а USR2 – просто сообщение.
Программа запускается в фоне, поэтому имеет ограниченное количество циклов реализации. Задается это в качестве входного параметра.
Запуск и анализ результатов:
$gcc –o father father.c
$ ./father 4&
[1] 4669484
Father: creating son
Son: My PID is 4673581
Son: I caught #16
Father: I've caught signal #16
Father: my PPID = 2236453 and PID = 4669484
Son: sending a signal to father
Son: kawai family ^^
Father: =^_^=
SON: Signal was successfully send!
Рассмотрим действительную реакцию на отправленные сигналы. Сначала сыну:
$kill -s SIGUSR2 4673581
Son: kawai family ^^
$ kill -s SIGUSR1 4673581
Son: I caught #16
Son: sending a signal to father
Son: kawai family ^^
Father: =^_^=
Son: end
В первом случае сын вывел лишь сообщение, во втором послал родительскому процессу сигнал USR2, который также отразился строчкой “Father: =^_^=”. Стоит отметить, что посылка сигнала SIGUSR2 из обработчика USR1 спровоцировала обработку в обоих процессах – родительском и текущем.
В случае посылки сигналов отцу, все происходит аналогичным образом:
$ kill -s SIGUSR1 4669484
Father: I've caught signal #16
Father: my PPID = 2236453 and PID = 4669484
Father: end
Мы послали с терминала сигнал USR1 и процесс-отец его перехватил, о чем нас известил.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.