fork和wait系统调用问题

时间:2013-06-30 14:23:13

标签: c++ fork pipe wait

我用fork()和wait()系统调用在unix中编写了一个基本的c ++程序。我只创造了一个孩子。我用过两根管子。因此,在使用第一个管道进行fork操作后,我正在从子节点写入父节点,并且在父节点接收到数据之后,父节点将在第二个管道中写回子节点。在父方面之后我使用wait(0)系统调用。但是我的父进程在子进程之前仍然会死?

结构是这样的:

 main()
 char buff[] = "Parent process kills";
 char cuff[] = "before Child process";
 int fd1[2];
 int fd2[2];
 pipe(fd1);
 pipe(fd2);
 if((pid = fork()) == 0)
 {
   close(fd1[0]);
   close(fd2[1]);
   write(fd1[1],buff,strlen(buff)+1);
   read(fd2[0],cuff,sizeof(cuff));

 }
 else
 {
    close(fd1[1]);
    close(fd2[0]);

    read(fd1[0],buff,sizeof(buff));
    write(fd2[1],cuff,strlen(cuff)+1);
    wait((int *) 0);
  }

  close(fd1);
  close(fd2);

  }'

即使使用了wait()但父进程仍然在子进程之前死亡。 谢谢你。

3 个答案:

答案 0 :(得分:0)

您对read的调用会导致未定义的行为。您尝试读取字符串文字,而不是您拥有的缓冲区。在这种情况下,它可能会导致崩溃。

您的write调用也会写一个字符串文字而不是您拥有的缓冲区。

此外,由于您已将字符数组初始化为字符串,因此sizeo(buff)strlen(buff) + 1相等。

答案 1 :(得分:0)

你确定你不会因为段错误而死吗?这些命令中的每一个都试图发送超出您的意图:

write(fd1[1],"buff",strlen(buff)+1);

write(fd2[1],"cuff",strlen(cuff)+1);

并且每个都试图接收到只读存储器:

read(fd2[0],"cuff",sizeof(cuff));

read(fd1[0],"buff",sizeof(buff));

答案 2 :(得分:0)

中有一个微妙的错误
if(pid == fork())

您将fork()的结果与pid进行比较,而不是分配给它并将其与零进行比较。你想写的是:

if((pid = fork()))

请注意额外的一组括号,它们告诉编译器您确实想要进行分配,并且您不希望对其进行警告。

使用更正后的if,你让父进行第一种情况,而不是第二种情况,所以正确的代码是:

if(pid == fork()) {
  close(fd1[1]);
  close(fd2[0]);

  read(fd1[0],"buff",sizeof(buff));
  write(fd2[1],"cuff",strlen(cuff)+1);
  wait((int *) 0);
} else {
  close(fd1[0]);
  close(fd2[1]);
  write(fd1[1],"buff",strlen(buff)+1);
  read(fd2[0],"cuff",sizeof(cuff));
}