2012-02-02 15 views
1

私はパイピングを実行するプログラムを実行しています。 実行したいコマンドはls |ネコ。Cでパイプ、dup2、ファイル記述子を閉じますか?

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はうまくいきます(ただし、パイプは閉じず、ただ何もしないで待っています)。私はストリームや何かを閉じなかったからだと思うが、確かに知るためにはC/IOで十分に精通していない。私はこの権利をしていますか?

この関数を実行するコードが

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

編集のようなものです:ウル右、致命、私はarguementに

thxsをミスタイプし、私はちょうどパイプを閉じるために必要なように見えます[1]で親

答えて

3

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