0

パイプを使用して、子プロセスのstdinとstdoutをリダイレクトしたいと思います。

現在、私は次のコードを持っています:

void child(int pipeIn[], int pipeOut[]) {

    char buff[20];
    const char msg[]="Child Message\n";
    close(pipeIn[1]);
    close(pipeOut[0]);

    if (dup2(pipeIn[0], 0))
        perror("dup2 pipeIn");

    if (dup2(pipeOut[1], 1))
        perror("dup2 pipeOut");

    close(pipeIn[0]);
    close(pipeOut[1]);

    for (int i = 0; i < 10; ++i) {
        read(0, buff, 20);
        fprintf(stderr, "Child: %s\n",buff);
        printf("%s",msg);
    }
}

void parent(int pipeIn[], int pipeOut[]) {

    char buff[20];

    const char msg[]="Parent Message\n";
    close(pipeIn[0]);
    close(pipeOut[1]);

    for (int i = 0; i < 10; ++i) {
        write(pipeIn[1], msg, 16);
        read(pipeOut[0], buff, 50);
        printf("Parent: %s", buff);

    }

}

void test() {

    int pipeOut[2],pipeIn[2];

    if(pipe(pipeOut)) {
        perror("pipeOut");
        exit(1);
    }

    if(pipe(pipeIn)) {
        perror("pipeIn");
        exit(1);
    }

    int pid = fork();

    if (pid == -1) {
        perror("fork()");
        exit(1);
    } 
    else if (pid == 0) 
        child(pipeIn, pipeOut);
    else 
        parent(pipeIn,pipeOut);

}

ただし、このコードは取得し続けるため機能しません

dup2 pipeOut:未定義のエラー:0

そして、それはデッドロックに陥ります。
親が子の応答(決して到着しない)を待ち続け、同じように子が決して到着しない入力を待ち続けるため、コードが停止することを理解しています。

私が理解していないのは、なぜ私がそのエラーを受け取り続けるのかということです。私は何か間違ったことをしていますか?

私はMacOSLion10.7.2とXcode4.2.1に取り組んでいます。


更新:Adam Rosenfieldの回答の後、ifステートメントを修正しました。しかし、私が言ったように、コードはまだ停止しています(私は子供が最初に印刷したものだけを読むことができ、他にはChild: Parent Message何も読むことができません)。

なぜこれが起こっているのか考えていますか?

4

1 に答える 1

2

dup2(2)成功すると、負でない整数、つまり新しいファイル記述子を返します。エラーの場合は-1を返します。あなたの場合、パイプをファイル記述子0に複製しているため、最初の呼び出しで0が返されます。

これを修正するには、チェックをからif(dup2(...))に変更しますif(dup2(...) == -1)

于 2012-03-19T16:59:23.317 に答える