我正在按照[Mat][1]的建议使用IPC来解决这个问题,但是我仍然无法做到
顺便说一句,这是个例行公事,不是家庭作业!但我要考试了
请帮我……:)
有人在这里指出我做错了什么。孩子2没有发送或父母没有收到孩子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://stackoverflow.com/users/635608/mat

最佳答案

POSIX
wait()和waitpid()函数应获取与调用方的一个子进程相关的状态信息。
不能使用这些函数在兄弟姐妹之间进行同步,只能从一个等待其子级的父级进行同步。
您需要使用一些“真正的”同步原语来实现您所追求的目标(信号量或其他形式的IPC)。

10-07 19:43
查看更多