建立子程序的管道

檔案描述符和 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;
    }
}