我是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?
谢谢您!
如果孩子在read()之前关闭fd [1],那似乎工作正常,但我不明白为什么。