Как отправить сигналы между процессами? - PullRequest
0 голосов
/ 10 января 2019

Итак, я хочу посылать сигналы между процессами.

Я хочу отправить сигнал, начиная с child1, перехватить parentprocess и, после этого, отправить тот же сигнал дочернему процессу 2. Когда дочерний элемент 2 получит сигнал, я хочу отправить еще один сигнал родительскому дочернему процессу, а затем родительский дочерний процесс убивает оба дочерних процесса.

Я пробовал это:

new_pid = fork();
                        sleep(3);
                        switch(new_pid) {
                        case -1:
                                perror("fork failed");
                                exit(1);
                        case 0:
                                kill(getppid(), SIGUSR1);
                                sleep(3);
                                pause();
                                break;
                        default:
                                signal(SIGUSR1, trata_SIGSEGV);
                                sleep(3);
                                new_pid2 = fork();
                                sleep(3);
                                kill(new_pid2, SIGUSR1);
                                sleep(3);
                                switch(new_pid2) {
                                case -1:
                                        perror("fork failed");
                                case 0:
                                        signal(SIGUSR1, trata_SIGSEGV);
                                        kill(getppid(), SIGUSR2);
                                        sleep(3);
                                        pause();
                                        break;
                                default:
                                        signal(SIGUSR2, trata_SIGSEGV);
                                        kill(new_pid, SIGKILL);
                                        kill(new_pid2, SIGKILL);
                                        break;
                                }
                                break;

Только родительский ребенок получает сигнал, затем ничего не происходит и переходит в меню программы).

   void trata_SIGSEGV(int sig){

        if (sig == SIGUSR1) {
                printf("Received");
        }

        if (sig == SIGUSR2) {
                printf("Received");
        }

        if (sig == SIGINT) {
                printf("Received");
        }
}

1 Ответ

0 голосов
/ 10 января 2019

Здесь происходит несколько проблем. В trata_SIGSEGV может быть больше.

  1. Вы не даете времени после разветвления для процессов, которые нужно настроить, чтобы быть готовыми к обработке. Поскольку вы отправляете сигналы завершения по умолчанию, скорее всего, они убивают получателя до того, как получатель его прослушивает. (Думаете ли вы, что сигнал ждет сигнала? Это не так; он просто определяет, что следует делать, если / когда сигнал случится.)
  2. Строка 19 пытается отправить сигнал trata_SIGSEGV для обработки SIGUSR2. Это не сработает.
  3. Вы заканчиваете проблемой, с которой начинаете - основной поток выполнения не имеет задержек в своей обработке, от разветвления процессов до указания планировщику просто завершить их.

На современном компьютере, вероятно, даже задержка в миллисекунду будет намного более чем достаточной для настройки обработчиков сигналов. Но если вы хотите, чтобы они происходили надежно, вам нужно дать как минимум некоторую задержку, чтобы другие процессы смогли добраться туда, где они должны быть.

В качестве альтернативы, я думаю, вы могли бы установить обработчики сигналов в родительском объекте, а затем выполнить форк.

Учитывая ваше обновление, мне интересно, откуда вы знаете, какой процесс получил какой сигнал. Мое предложение для вашего обработчика сигнала:

void trata_SIGSEGV(int sig) {
    printf("%d received signal %d\n", getpid(), sig);
    if (SIGINT == sig) exit(1);
}

Кроме того, я замечаю, что вы отправляете первый сигнал процессу 2, прежде чем проверять, что представляет собой ответная вилка, поэтому процесс 2 сигнализирует сам, прежде чем он, возможно, сможет настроить обработчики сигналов. Настройте обработчики сигналов перед тем, как разветвляться, чтобы там не было гонки. В моем собственном тесте вашего кода я проверил, что обработчики сигналов сохраняются в форке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...