2017-01-09 241 views
0

我需要fork两个子进程。人们可以接收到信号3,打印hello并将信号4发送给另一个子进程;另一个可以接收信号4,打印world并将信号3发送给第一个子进程。
要开始,父进程会在睡眠3秒后将信号3发送到第一个子进程。
然后3秒钟后,父进程将发送SIGKILL杀死他们两个。
fork和信号:如何从父进程发送信号到特定子进程

我不知道如何发送信号到一个特定的子进程(我知道我们有一个功能kill发送信号,但我不知道在这里使用它)。

这里是我的代码:

#include <stdio.h> 
#include <signal.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <stdlib.h> 

void func(int n) 
{ 
     printf("ping\n"); 
     // how to send signal 4 to the second process? 
} 

void func2(int n) 
{ 
     printf("pong\n"); 
     // how to send signal 3 to the first process? 
} 

int main() 
{ 
     pid_t pid; 
     int i; 
     for(i = 0; i < 2; i++) 
     { 
       pid = fork(); 
       if(pid == 0) 
       { 
         if(i == 0) 
         { 
           signal(3, func); 
         } 
         else 
         { 
           signal(4, func2); 
         } 
         while(1); 
       } 
       else 
       { 
         if(i == 1) 
         { 
           sleep(3); 
           // how to send signal 3 to the first child process? 
           sleep(3); 
           // how to kill the two children? 
         } 
       } 
     } 


     return 0; 
} 
+1

在信号上下文中调用'printf()'的未定义行为。 – EOF

+0

http:// man7。org/linux/man-pages/man2/kill.2.html – alk

+0

@EOF我应该怎么做? – Yves

回答

0

您可以使用POPEN()函数分叉并打开一个管道,该进程(而不是使用fork()的直接)打开的过程

的父母都知道每个进程的PID可以很容易地将第二个孩子的PID传递给第一个孩子。

第一个孩子可以使用pid和kill()函数将信号传递给第二个孩子。

所以,使用popen()来启动第一个孩子。使用fork()启动第二个孩子,然后通过使用popen()创建的流将第二个孩子的pid传递给第一个孩子。

对调用fork()返回的pid值的处理没有得到正确处理。

张贴的代码作出假设调用fork()是成功的。这不是一个安全/有效的假设

代码还需要检查PID是-1,妥善处理那个错误。

当子进程完成时,它不应该坐在while()循环中,而应该使用exit()函数退出。

父母不应该只是退出,因为这会将两个子进程留作僵尸。 (僵尸都很难摆脱短期的系统重启。)

相反,父母应该叫wait()甚至更​​好waitpid()(记住子进程需要真正退出,而不是在while()环坐。

1)func()func2()应检查参数以确保它是正在处理的正确信号。

2)signal()的手册页表明不应该使用它。该手册页建议使用:sigaction(),

0

当你fork你得到新的pid。每kill manpage调用kill(pid_t pid, int sig);使用pid

+0

如果我在第一个“睡眠(3)”之后写入'kill(pid,3)',我认为它会发送给所有子进程。我需要的是发送到第一个子进程。 – Yves

+0

@Thomas:no;它会将信号发送到一个进程,除非您对'pid'使用零或负值。 –

+0

好的。我知道了。我还有一个问题:如何分享进程之间的pid?因为我需要'func'中的'kill(4,secondProcessPid)'和'func2'中的'kill(3,firstProcessPid)'。如何获得这两个pid?我必须使用共享内存之类的东西吗? – Yves