0

我用 fork() 和 wait() 系统调用在 unix 中编写了一个基本的 c++ 程序。我只创造一个孩子。我用过两根管子。因此,在使用第一个管道进行分叉操作后,我正在从子级向父级写入,并且在父级接收到数据后,父级在第二个管道中回写给子级。之后在父方我使用 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() ,但父进程仍然在子进程之前死亡。提前致谢。

4

3 回答 3

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));
于 2013-06-30T14:30:40.310 回答
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));
}
于 2013-06-30T14:32:41.723 回答
0

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

您的write调用还会写入字符串文字,而不是您拥有的缓冲区。

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

于 2013-06-30T14:25:57.320 回答