读取系统调用已阻止共享管道

问题描述 投票:0回答:1

我是Unix系统编程的新手,正在努力理解文件描述符和管道。让我们考虑这个简单的代码:

#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>

int main() {
  int fd[2], p;
  char *m = "123456789\n", c;
  pipe(fd);
  p = fork();
  if (p == 0) {
    // child
    while(read(fd[0], &c, 1) > 0) write(1, &c, 1);
  }
  else {
    // parent
    write(fd[1], m, strlen(m));
    close(fd[1]);
    wait(NULL);
  }
  exit (0);
}

当我编译并运行代码时,它将输出123456789,但是除非发出^ C,否则该过程永远不会结束。实际上,两个进程在htop中都显示为已停止。

如果孩子在read()之前关闭fd [1],那么似乎可以正常工作,但我不明白为什么。 fd在两个进程之间共享,并且父进程在写入后关闭fd [1]。为什么孩子在阅读时没有得到EOF?

谢谢您!

c unix pipe fork
1个回答
0
投票

如果孩子在read()之前关闭fd [1],那似乎工作正常,但我不明白为什么。

© www.soinside.com 2019 - 2024. All rights reserved.