建立子进程的管道

文件描述符和 FILE 对象是每个进程资源,它们本身不能通过普通 I / O 在进程之间交换。因此,为了使两个不同的进程通过匿名管道进行通信,一个或两个参与进程必须从创建管道的进程继承一个打开的管道端,因此必须是父进程或更远的祖先。最简单的情况是父进程想要​​与子进程通信的情况。

由于子进程必须从其父进程继承所需的打开文件描述,因此必须首先创建管道。父母然后分叉。通常,每个过程要么严格地是读者,要么严格地是作者; 在这种情况下,每个应该关闭它不打算使用的管道端。

void demo() {
    int pipefds[2];
    pid_t pid;

    // Create the pipe
    if (pipe(pipefds)) {
        // error - abort ...
    }

    switch (pid = fork()) {
        case -1:
            // error - abort ...
            break;
        case 0:   /* child */
            close(pipefds[0]);
            write(pipefds[1], "Goodbye, and thanks for all the fish!", 37);
            exit(0);
        default:  /* parent */
            close(pipefds[1]);

            char buffer[256];
            ssize_t nread = read(pipefds[0], sizeof(buffer) - 1);

            if (nread >= 0) {
                buffer[nread] = '\0';
                printf("My child said '%s'\n", buffer);
            }

            // collect the child
            wait(NULL);

            break;
    }
}