如何让子进程等待其兄弟?

Posted

技术标签:

【中文标题】如何让子进程等待其兄弟?【英文标题】:How to make a child process waits for its sibling? 【发布时间】:2012-06-30 06:16:42 【问题描述】:

我正在按照 [Mat][1] 的建议使用 IPC 来解决它,但我仍然无法做到 顺便说一句,它是示例练习,而不是家庭作业!但是我要考试了 请在这里帮助我...:) 有人在这里指出我做错了什么。Kid2 没有发送或父母没有收到来自孩子 2 的任何信号。

谢谢。

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

void my_handler_for_kid2(int sig_num)  
  printf("KID2:Recieved SIGUSR1 from KID1\n");  
  
void my_handler_for_parent(int sig_num)  
  printf("PARENT:Recieved SIGUSR2 from KID2\n");  
  

int main()  
  int status;  
 pid_t kid1,kid2;  

  void my_handler_for_kid2(int sig_num);  
  void my_handler_for_parent(int sig_num);  
  signal(SIGUSR1,my_handler_for_kid2);
  signal(SIGUSR2,my_handler_for_parent);
  kid1=fork();  
  if(kid1 < 0)  
    printf("Fork not successfull\n");  
    
  else if(kid1 == 0)  
    printf("I am KID1[%ld] and I am going to sleep\n",(long) getpid());  
    sleep(5);  
    printf("Just woke up!\n");  
    kill(kid2,SIGUSR1);  
        
  else  
    kid2=fork();  
    if(kid2 < 0) 
      printf("Fork not successfull\n");  
      
    else if(kid2 == 0)  
      printf("I am KID2[%ld] and I am going to wait for KID1 to wakeup\n",(long)       getpid());  
      pause(); 
      //signal(SIGUSR1,my_handler_for_kid2);  
      kill(getppid(),SIGUSR2);  
      
    else  
      printf("Father[%ld] here and going to wait for both kids to respond to me\n",    (long) getpid());  
      pause();
      //signal(SIGUSR2,my_handler_for_parent);  
      waitpid(kid1,&status,NULL);  
      waitpid(kid2,&status,NULL);  
      
   
 

rizwan@riz-pc:~/Documents$ ./a.out
I am KID1[2278] and I am going to sleep
 Father[2277] here and going to wait for both kids to respond to me
 I am KID2[2279] and I am going to wait for KID1 to wakeup
 Just woke up!
KID2:Recieved SIGUSR1 from KID1
^C
rizwan@riz-pc:~/Documents$ 








  [1]: http://***.com/users/635608/mat  

【问题讨论】:

【参考方案1】:

来自POSIX:

wait() 和 waitpid() 函数应获取与调用者的一个子进程有关的状态信息。

您不能使用这些函数在兄弟姐妹之间进行同步,只能从一个等待其子代的父代同步。 您需要使用一些“真正的”同步原语来实现您所追求的(信号量,或其他形式的IPC)。

【讨论】:

编写一个fork两个孩子的程序,第一个孩子休眠10秒(使用系统调用sleep),第二个孩子等待第一个孩子结束并打印与结束相关的消息第一个孩子。父亲等待两个儿子结束并打印终止进程的id。 我不会为你做你的任务。我在上面解释了为什么你的方法(使用从兄弟到另一个的等待)行不通。查看我发布的 IPC 链接,了解如何在两个兄弟姐妹之间进行通信。 我很抱歉,但我不是要你这样做...thanx反正...:) "...需要使用一些“真正的”同步原语...":riz 描述的情况可以通过使用signal()ling 很好地解决相关功能。 @alk:查看这篇文章的编辑历史。原始代码与当前可见的内容无关。【参考方案2】:

互斥同步可以工作。

【讨论】:

【参考方案3】:

为此,您应该使用条件变量。从网上学习任何教程。

【讨论】:

欢迎来到 Stack Overflow。您可能是在暗示“条件变量”吗?无论如何,“在网上搜索教程”并不是很有帮助。此处的最佳答案提供了详细信息和一两个精心挑选的链接。

以上是关于如何让子进程等待其兄弟?的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭 Qt 子进程并让子进程执行清理代码?

Golang如何让子进程以另一个用户身份运行

进程等待与程序替换

Python - 调用 perl 作为子进程 - 等待完成其后台进程并打印到 shell

java 多线程基础

Linux——进程等待程序替换