1

パイピングを行うプログラムを実行しています。実行したいコマンドは ls | です。猫。

int cmd(char** w, int* pipe, int action){
... some code up here
...
int fd;
if(child_pid == 0) {
    if (pipe != 0) {

        if (action == 0){
            fd = dup2(pipe[0], STDIN_FILENO);
            close(pipe[0]);
            close(pipe[1]);
            //close(fd);
        }
        else if (action == 1){
            fd = dup2(pipe[1], STDOUT_FILENO);
            close(pipe[0]);
            close(pipe[1]);
            //close(fd);
        }


    }

    execvp(w[0], w);



    printf("Unknown command\n");
    exit(0);
  }
... some code down here

コードを実行すると、コマンド ls | cat は正常に動作しますが、cat は終了しません (つまり、パイプは閉じず、何もせずにそこで待機します)。ストリームか何かを閉じていなかったことが原因だと思いますが、C/IO に精通していないため、確実に知ることができません。私はこれを正しく行っていますか?

この関数を実行するコードは次のようになります

int fd[2];
int p = pipe(fd);
cmd(w, fd, 1);
cmd(w, fd, 0);

編集:あなたは正しい、致命的なエラー、私は引数を間違って入力しました

thxs、親のパイプ[1]を閉じる必要があったようです

4

1 に答える 1

3

cmd親プロセスは、2 つの呼び出しの後、パイプの両端も閉じる必要があります。

于 2012-02-02T04:32:29.227 に答える