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/

10-10 04:00