1

以下に書かれているコードから疑わしい点があります。

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

パイプの書き込み部分(pdf[1])は前のstdoutの場所に配置する必要があるため、stdout fdを閉じる必要があることを理解できます。(dup(pdf[1]))

ただし、なぜパイプの一部を読み取り (close(pdf[0]) )パイプの書き込み部分を閉じる必要があるのか​​ (close(pfd[1])) を理解できませんでした。

パイプは双方向とはいえ、使用しないパイプの他の部分を閉じた状態にする必要はないと思います。

特に、close(pdf[1]) <- この部分、出力ストリームがない場合 (execlp 関数を実行する前に stdout と pdf[1](パイプの書き込み部分) が閉じられたため)、execlp 関数の出力はどこに行きましたか? ?

4

1 に答える 1

4

パイプは双方向ではありません — 読み取り側に書き込むことはできず、書き込み側から読み取ることもできません。

パイプの読み取り操作は、書き込み側が開いているプロセスが存在する間は、読み取りを試みているプロセスだけが書き込み側を開いている場合でも、EOF を報告しません。

したがって、十分な数のファイル記述子を閉じることが重要です。経験則として、dup2()ordup()を使用してパイプの一端を標準入力または標準出力にする場合は、両方のパイプ ファイル記述子を閉じる必要があります。

于 2016-04-07T05:27:25.423 に答える