Средства межпроцессорного взаимодействия, страница 2

Листинг 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 и процесс-отец его перехватил, о чем нас известил.