这是代码:
int main() {
int fd[2];
pipe(fd);
int r = fork();
if (r > 0) { //parent
close(fd[0]);
// do a bunch of things
} else { //child
close(fd[1]);
// do a bunch of things
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是一段代码,其中父级写入管道,子级从管道读取。我的问题是:对于这两个 close 语句,它们到底关闭了什么?父母和孩子应该共享同一个文件,即 fd[0] 和 fd[1]。如果 fd[0] 在父级中关闭,它不应该在子级中也关闭吗?
来自http://linux.die.net/man/2/pipe pipe()创建一个由两个文件描述符组成的管道,这两个文件描述符对应于管道的两个“端”,即读取端和写入端。它实际上与文件不同。内核从写端读取数据,为您缓冲,然后将其传输到读端。
这应该可以清楚地说明为什么pipe()创建两个文件描述符。writer将其需要的所有数据写入write fd并关闭fd。这也会触发EOF发送。读取器通常会继续读取数据,直到遇到EOF并结束。在这种情况下,有一段时间写 fd 被关闭,但数据仍然缓冲在管道中,等待读取器读出。拥有单个 fd 是没有意义的,因为您需要在编写器和读取器进程之间进行另一层协调,否则谁将在何时进行关闭?