2

我使用管道在父进程和子进程之间进行通信。我读的书说,在父进程中,我必须关闭 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);
    }
}
4

2 回答 2

1

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

于 2012-04-12T09:44:36.757 回答
0

好吧,关闭管道的建议是为了保护您自己:这样您的读取器进程就不会意外地写入管道,而写入器进程也不会意外地读出一些数据。所以通常它是一种防御性编程技术。

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

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

但是,您的程序并非如此。

但尽管如此,我还是建议关闭管道。这样,如果您错误地访问了错误的管道末端,您将收到错误消息。

于 2012-04-12T09:04:15.850 回答