为什么我的while(read)循环管道永远不会结束?

时间:2016-03-19 21:25:01

标签: c string while-loop pipe fgets

// Some initialization

// Child process
// stdin is redirected to fd[0]
while (fgets(someCharArray, sizeof(someCharArray), stdin) {
    printf("%s\n", someCharArray);
}

// Parent process
char greeting[50] = "hello\n\0";
write(fd[1], greeting, sizeof(greeting));
close(fd[1]);

我真的被这些烟斗困惑了。 fgets应该读取并包含换行符。它读取并成功打印“你好”。但是,这个过程并没有结束。我已经关闭了父管道的写端。所以它应该返回0或EOF,并且while循环应该退出。

我尝试过使用和不使用换行符和null终止符的“hello”的不同组合。我真的不明白这是什么问题。

1 个答案:

答案 0 :(得分:0)

要让fd[0]到达EOF,您需要在知道它们的所有流程中关闭fd[1]。 在您的情况下,您应该在fd[1]

之后立即关闭子流程中的fork()
if (fork() == 0)
{
    close(fd[1]);
    // ...
    // instructions for child process
    exit 0;
}