管道和管道UNIX

时间:2016-04-07 05:22:43

标签: c linux unix pipe dup

我从下面的代码中得到了一个可疑点。

#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]) )

即使管道是双向的,我认为没有必要说明关闭不使用的管道的其他部分。

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

1 个答案:

答案 0 :(得分:3)

管道不是双向的 - 读取端无法写入,写入端无法读取。

管道上的读取操作不会在写入结束打开的过程中报告EOF,即使打开写入结束的唯一进程是尝试读取的进程。

因此,关闭足够的文件描述符至关重要。根据经验,如果使用dup2()dup()将管道的一端设为标准输入或标准输出,则应关闭两个管道文件描述符。 / p>