为什么我的 while(read) 管道循环永远不会结束?
Why does my while(read) loop with pipes never end?
// 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[=10=]";
write(fd[1], greeting, sizeof(greeting));
close(fd[1]);
我真的被这些管道弄糊涂了。 fgets
应该阅读并包括换行符。它读取并成功打印 "hello"。然而,这个过程并没有结束。我已经关闭了父级管道的写入端。所以它应该 return 0 或 EOF
,并且 while 循环应该退出。
我尝试了 "hello" 的不同组合,有和没有换行符和空终止符。实在是看不出问题所在
为了让 fd[0]
达到 EOF
,您需要在所有知道它们的进程中关闭 fd[1]
。
在您的情况下,您应该在 fork()
之后立即关闭子进程中的 fd[1]
if (fork() == 0)
{
close(fd[1]);
// ...
// instructions for child process
exit 0;
}
// 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[=10=]";
write(fd[1], greeting, sizeof(greeting));
close(fd[1]);
我真的被这些管道弄糊涂了。 fgets
应该阅读并包括换行符。它读取并成功打印 "hello"。然而,这个过程并没有结束。我已经关闭了父级管道的写入端。所以它应该 return 0 或 EOF
,并且 while 循环应该退出。
我尝试了 "hello" 的不同组合,有和没有换行符和空终止符。实在是看不出问题所在
为了让 fd[0]
达到 EOF
,您需要在所有知道它们的进程中关闭 fd[1]
。
在您的情况下,您应该在 fork()
fd[1]
if (fork() == 0)
{
close(fd[1]);
// ...
// instructions for child process
exit 0;
}