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),最好的沟通方式是什么? 最佳答案
父级和子级都有管道的读写端。因为仍然有一个开放的写端,所以读不能返回EOF。
修复方法是,如果不打算写入管道,则关闭管道的写入端;如果不打算读取管道,则关闭管道的读取端,例如。
if (fork()) {
close(pipefd[1]);
read(pipefd[0], &c, 1); /* == 0 */
} else {
close(pipefd[0]);
close(pipefd[1]);
}
关于linux - 如何与家长沟通, child 关闭了管道的写端?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42034564/