UNIX 中的 pipe 和 dup 函数

pipe & dup functions in UNIX

我从下面写的代码中有一个疑点。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(void){

        int pid;
        int i,j;
        char c;

        int pfd[2];

        if(pipe(pfd) == -1){
                perror("pipe");
                exit(1);
        }
        // pfd[0] : process read from pfd[0]
        // pfd[1] : process write to pfd[1]

        pid = fork();

        if(pid == -1){
                perror("pid error\n");
                exit(1);
        }
        else if(pid == 0){
                close(pfd[0]);
                close(1);
                dup(pfd[1]);
                close(pfd[1]);
                execlp("./lcmd", "lcmd", NULL);
                exit(0);
        }
        else if(pid > 0){

                wait(NULL);
                close(pfd[1]);
                close(0);
                dup(pfd[0]);
                close(pfd[0]);
                execlp("./rcmd", "rcmd", NULL);
                printf("\n");
        }

        return 0;
}

这段代码解释了如何处理 dup 函数。

如您所见,如果 pid 等于 0(这意味着子进程正在进行中),则关闭管道的读取部分并关闭 stdout 文件描述符。 (关闭(pdf[0]),关闭(1))。

我可以理解 stdout fd 应该关闭,因为管道 (pdf[1]) 的写入部分应该位于之前的 stdout 位置。 (dup(pdf[1]))

但是,我不明白为什么应该关闭管道的读取部分 (close(pdf[0])写入管道的部分 (关闭(pfd[1])).

尽管管道是双向的,但我认为没有必要声明关闭管道的其他部分将不会被使用。

特别是,close(pdf[1]) <- 这部分,如果没有输出流(因为stdout和pdf[1](管道的写入部分)在执行execlp函数之前被关闭),在哪里execlp函数的输出到哪里去了?

管道不是双向的——读取端不能写入,写入端不能读取。

当存在写端打开的进程时,管道上的读取操作不会报告 EOF,即使打开写端的唯一进程是尝试读取的进程。

因此,关闭足够的文件描述符是至关重要的。根据经验,如果您使用 dup2()dup() 使管道的一端成为标准输入或标准输出,您应该关闭 both 管道文件描述符。