read
返回0:
#include <unistd.h>
int main() {
int pipefd[2];
char c;
pipe(pipefd);
close(pipefd[1]);
read(pipefd[0], &c, 1);
}
在上面的代码中,read
返回。但如果我们分叉孩子,这不起作用:
#include <unistd.h>
int main() {
int pipefd[2];
char c;
pipe(pipefd);
if (fork())
read(pipefd[0], &c, 1);
else
close(pipefd[1]);
}
此处close
成功,但read
挂起。孩子已经关闭的最佳沟通方式是什么,所以父母的read
会返回(0)?
答案 0 :(得分:2)
父和子都有管道的读写端。因为仍有一个打开的写入结束,所以读取不能返回EOF。
如果您不打算写入管道,则修复是关闭管道的写入端,如果您不打算从管道读取,则关闭管道的读取端,例如< / p>
if (fork()) {
close(pipefd[1]);
read(pipefd[0], &c, 1); /* == 0 */
} else {
close(pipefd[0]);
close(pipefd[1]);
}