我正在尝试将用户定义的(SIGUSR1或SIGUSR2)信号从parrent进程发送到子进程。子进程接收信号后,等待5秒钟,并向parrent进程发送另一个用户定义的信号。当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 Stackoverflow!");
}
}
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);
}
}
答案 0 :(得分:1)
你在程序中犯了许多信号no-nos。我看到的最阴险的问题是赛车问题。在fork
和您为孩子注册信号处理程序的时间之间有一个机会窗口,在此期间SIGUSR1
可以发送和丢失。
查看您的具体代码,想象一下您fork
,父母获得第一次机会的情况,在孩子建立处理程序之前将SIGUSR1
发送给孩子 强>这个信号永远消失了。解决此问题的最简单方法是在分叉之前建立SIGUSR1
信号处理程序。
代码中的其他问题:
sigaction
printf
在技术上并不安全