我没有关闭管道的一端,有什么不对的?

我使用管道在父proc和子proc之间进行通信。 我读过的那本书说在父母的proc中,我必须关闭pipefd [1],但我没有这样做,没有其他事情发生,所以我的问题是“如果我不关闭pipefd [1],有什么不受控制的?” 最好的祝福!

int pipefd[2]; if(pipe(pipefd) == -1) { perror("pipe communication error"); exit(EXIT_FAILURE); } int fd = fork(); if(fd < 0) { perror("fork child process error"); exit(EXIT_FAILURE); } if(fd != 0)//run in parent proc { int a = -1; int i = 1; //close(pipefd[1]); ## here! ## while(i) { read(pipefd[0], &a, sizeof(a)); printf("%d\n", a); sleep(4); } } else//run in child proc { int i = 1; //close(pipefd[0]); ## here! ## while(i) { write(pipefd[1], &i, sizeof(i)); i++; sleep(1); } } 

如果读取器没有关闭管道的写入端,则当写入器进程关闭它时,它将不会收到文件结尾(因为仍然为写入端打开了文件描述符)。

好吧,关闭管道的建议是为了保护你自己:这样你的读者进程不会意外写入管道,并且编写器进程不会意外地读取一些数据。 所以一般来说它是一种防御性的编程技术。

只要您不能访问要关闭的管道,就不会发生任何不好的事情。

好吧,我在这里不是100%正确:我的陈述适用于像你这样的简单程序,但如果你打开并忘记关闭大量管道,那么你的程序会泄漏它们,迟早(通常在255左右之后)打开管道,但YMMV)你将无法打开一个新的。 因为所有管槽都会被泄漏的管道耗尽。

但是,对于您的计划,情况并非如此。

但不过我会建议关闭管道。 这样,如果错误地访问错误的管道末端,您将收到错误。