Отправка сигналов между родительским и дочерним процессами

Я пытаюсь отправить определенный пользователем сигнал (SIGUSR1 или SIGUSR2) от отдельного процесса к дочернему процессу. После того, как дочерний процесс получает сигнал, он ждет в течение 5 секунд и отправляет другой определенный пользователем сигнал в отдельный процесс. Когда процесс parrent принимает сигнал, он записывает строку на экран. Я не могу понять, как это сделать. Я пытаюсь сделать это на терминале Linux. Вот мой код:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>


void wait_function(int signal_1)
{
    signal(SIGUSR1,wait_function);

    if(signal_1==SIGUSR1)
    {
        sleep(5);
    }
}


void writeSomethingOnScreen(int signal_2)
{
    signal(SIGUSR2,createAndWrite);

    if(signal_2==SIGUSR2)
    {
    printf("Hello Stackru!");
    }
}


main()
{
    pid_t pid;
    pid=fork();

    if(pid==0)/*child*/
    {
        signal(SIGUSR1,wait_function);
        pause();
        kill(getppid(),SIGUSR2);
        exit(254);
    }

    if(pid>0)/*parent*/
    {
        signal(SIGUSR2,writeSomethingOnScreen);
        kill(pid,SIGUSR1);
    }
}

1 ответ

Решение

Вы делаете много сигналов no-nos в вашей программе. Самая коварная проблема, которую я вижу, - это гонки. Между тем временем, когда вы fork и время, когда вы регистрируете обработчик сигнала для ребенка, в течение которого SIGUSR1 могут быть отправлены и потеряны.

Глядя на ваш конкретный код, представьте ситуацию, когда вы fork, родитель получает первый шанс бежать, отправляет SIGUSR1 ребенку до того, как ребенок когда-либо установил обработчик, и этот сигнал теряется навсегда. Самый простой способ решить эту проблему - это установить SIGUSR1 обработчик сигнала перед разветвлением.

Другие проблемы в вашем коде:

  • Родительский процесс завершается задолго до того, как у него появляется возможность получить сигнал от дочернего процесса. То есть родитель не просто ждет своих детей
  • Сон в обработчике сигналов - это то, что вызывает у большинства программистов Unix. Обработчик сигнала должен быть максимально коротким и максимально простым
  • Я не вижу причин, по которым вы восстанавливаете обработчики сигналов внутри обработчиков сигналов - если вы хотите использовать "постоянные" обработчики sigaction
  • Не технически безопасно звонить printf из обработчика сигнала
Другие вопросы по тегам