2014-05-05 148 views
0

我正试图从parrent进程向子进程发送一个用户定义的(SIGUSR1或SIGUSR2)信号。子进程接收到信号后,会等待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

你在你的程序中提交了许多信号no-nos。我看到的最棘手的问题是赛车之一。在您注册子女的信号处理程序的时间与可以发送并丢失的时间之间有一个机会窗口。

看你的特定代码,试想一个情况下,你fork,母公司获得的第一个机会运行,发送SIGUSR1孩子曾经成立了一个处理程序孩子之前,该信号被永远失去了。解决这个问题最简单的方法是在之前建立SIGUSR1信号处理程序。

代码中的其他问题:

  • 父进程退出长时间有机会从孩子接收信号之前。也就是说,父母并不只是等待其子女
  • 睡在一个信号处理程序中是一种引发大多数Unix程序员的事情。信号处理程序应尽可能短暂和尽可能
  • 我看不出有什么理由你重新建立信号处理程序内部信号处理程序一样简单 - 如果你想“老大难”处理程序使用sigaction
  • 这在技术上并不安全调用printf来自信号处理程序
+0

重建信号处理程序中的信号处理程序是一个错误,我没有注意到这一点。 printf只是一个例子,我将在那里进行文件处理。我是unix编码新手,你的答案是正确的,但我不知道该怎么做。你能发送一个示例代码吗? – Curious

+0

'printf只是一个例子,我将在那里进行文件处理.'看起来像一个坏主意:文件处理不能使用任何printf()函数,malloc/free(和其他几个)。除此之外,还有一个更好的设计是保持信号处理器的轻量级:设置标志或写入管道并返回到原始流程。 – wildplasser