从父母发送信号给特定的孩子

时间:2016-12-12 18:50:15

标签: c process signals parent

我有一个父进程和两个子进程的树进程,我想发送一个信号,只有child2接收它,为child2创建一个处理程序,并在处理程序中收到它时显示一条消息。

pid_t pid, pid1, pid2;

if((pid=fork())==0)
printf("child1");
 else if((pid2=fork())=0)
   printf("child2);
   signal(SIGUSR1, handler); //EDITED
   else
     printf("parent");
     kill(pid2, SIGUSR1); //EDITED


void handler(int signal)
{
  printf("received");

但我不知道如何仅为child2发送信号 SIGUSR1

2 个答案:

答案 0 :(得分:0)

假设您的伪代码的缩进表示嵌套深度,现在原则上是正确的,但存在时序问题:

  • 父级可以在child2安装信号处理程序之前将信号发送给child2。为了解决这个问题,您可以让父级在派生child2之前安装处理程序(由子级继承)。
  • child2可以在父级发送信号之前结束,因此不会调用该处理程序。如果您希望看到它被调用,则可以给child2做些事情,即使它只是sleep(…)

答案 1 :(得分:0)

我希望这是您实际问题的伪代码。在这种情况下,问题在于父母需要等到孩子实际安装了处理程序。这可以通过让父母等到孩子发信号(“告诉我我已经准备好出发了”)来实现。

在父代码中有一个标记为bChildUp。然后等待

while (!bChildUp)
{
// do nothing till the child is up.
}

将信号从child2发送到父进程。接收信号的父进程可以将bChildUp = TRUE更改。父级将退出等待状态,您的任务可以继续进行(但是您可以通过使用siginfo_t获取发送信号的进程的pid并使用sigaction来注册信号来检查信号是否确实来自child2)。

遇到这类问题

  1. 拥有孩子创建的文件,父母知道孩子已成功创建。
  2. 或基于信令机制。

我建议在启动后在child2中仅创建一个文件,然后让父进程等待直到该文件被创建。