以下是代码:
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;
}
这是一段代码,其中父级写入管道,子级从管道读取。我的问题是:对于两个接近的陈述,它们到底是什么关闭的?父级和子级应共享相同的文件,即fd [0]和fd [1]。如果在父级中关闭了fd [0],那么它是否也应该在子级中关闭?
答案 0 :(得分:3)
From http://linux.die.net/man/2/pipe pipe()
创建一个由两个文件描述符组成的管道,这两个文件描述符对应于管道的两个“末端”,即读取端和写入端。它与文件不是一回事。内核正在从写端读取数据,为您缓冲数据,并将其传输到读取端。
这应该明确为什么pipe()
创建两个文件描述符。编写器将所需的所有数据写入write fd并关闭fd。这也会触发EOF
发送。读者通常会一直读取数据,直到遇到EOF
并结束它。在这种情况下,有一段时间写入fd被关闭但数据仍然在管道中缓冲,等待读者读出。拥有一个单独的fd是没有意义的,因为你需要在编写器和读者进程之间进行另一层协调,否则谁将完成关闭,何时?
答案 1 :(得分:0)
pipe()调用总是返回一个整数数组,其中数组的第一个元素是从管道读取的读取描述符,第二个元素是写入管道的写入描述符。管道提供单向通信。如果在父级和子级中关闭fd [0],则无处可读取管道,反之,如果在无法写入管道的两个进程中关闭fd [1],那么我们关闭读取一个进程中的描述符,以便进程只能写入,而另一个进程将关闭写入描述符,这将使进程只能从管道中读取。