0
int main(int argc, char ** argv) {
    int count = 2;


    int pid, status;
    int fd[count][2];
    int i;

    for (i = 0; i < count; i++) {
        if (pipe(fd[i]) != 0) {
            perror("pipe");
            exit(1);
        }
        pid = fork();
        if (pid < 0) {
            perror("fork");
            exit(1);
        } else if (pid == 0) {
            if (close(fd[i][1]) != 0) {
                perror("close");
                exit(1);
            } 
            int j;
            for (j = 0; j < i; j++ ) {
                close(fd[j][1]);
            }
            char w[MAXWORD];
        int result;
            result = read(fd[i][0], w, MAXWORD);
        w[result-1] = '\0';
            printf("child %s\n" w);
            if (result == -1) {
                perror("read");
                exit(1);
            }
            exit(0);
        } else {
            if (close(fd[i][0]) != 0) {
                perror("close");
                exit(1);
            }
        }
    }
    while (1) {
        char word[MAXWORD]; int c;
        c = read(STDIN_FILENO, word, MAXWORD);
        if (c == 0) {
                break;
        }
        word[c-1] = '\0';
        for (i = 0; i < count; i++ ) {
                write(fd[i][1], word, strlen(word)+1);
        }


        for (i = 0; i < count; i++ ) {
                if (close(fd[i][1]) != 0) {
                perror("close");
                exit(1);
                }
        }

        for (i = 0; i < count; i++) {
                wait(&status);
        }
    }
    return 0;
}

私のコードは、control+dがヒットするまでユーザーが入力する単語をループで読み取ります。その単語は、2つの子プロセスへのパイプに送信されます。それらの両方が単語を印刷します。while(1)ステートメントを削除すると、正常に機能します。問題は、while 1ループを保持しているときに、2回目に単語を入力すると、このエラーが発生することです。

$ query
hello
child hello
child hello
hello
close: Bad file descriptor

なぜそうなのかわからないので、本当に助けが必要です。ありがとうございました。

4

1 に答える 1

3

いくつかの問題

1)各子は一度だけ読み取り、エコーしてから終了しますが、whileループは各子に複数の単語を送信したいようです(これが問題の原因ではありません)

2)メインのwhileループで単語を読み取り、各子に書き込み、書き込み先のファイル記述子を閉じます。2回目のループでは、すべての記述子が閉じられるため、close呼び出しは失敗します。書き込み呼び出しも失敗しましたが、戻り値をチェックしていないため、気づいていませんでした。

于 2013-03-19T06:07:21.627 に答える