Отправка сигналов между родительским и дочерним процессами
Я пытаюсь отправить определенный пользователем сигнал (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
из обработчика сигнала