在父进程和子进程之间发送信号

时间:2014-05-05 18:34:13

标签: unix

我正在尝试将用户定义的(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);
    }
}

1 个答案:

答案 0 :(得分:1)

你在程序中犯了许多信号no-nos。我看到的最阴险的问题是赛车问题。在fork和您为孩子注册信号处理程序的时间之间有一个机会窗口,在此期间SIGUSR1可以发送和丢失

查看您的具体代码,想象一下您fork,父母获得第一次机会的情况,在孩子建立处理程序之前将SIGUSR1发送给孩子 这个信号永远消失了。解决此问题的最简单方法是在分叉之前建立SIGUSR1信号处理程序

代码中的其他问题:

  • 父进程在有机会接收来自孩子的信号之前就会退出。也就是说,父母不只是等待其子女
  • 在信号处理程序中睡眠是引起大多数Unix程序员的事情。信号处理程序应尽可能短暂且简单
  • 我认为没有理由在信号处理程序中重新建立信号处理程序 - 如果您希望“持久”处理程序使用sigaction
  • 从信号处理程序
  • 调用printf在技术上并不安全