2011-10-20 6 views
3

2つの子プロセス間にパイプを作成する方法はあまりよく分かりません。これは私がそれをやった方法です:C UNIXシェルのパイプ

pipe(&fd[0]);        //Create a pipe 
proc1 = fork(); 

//Child process 1 
if (proc1 == 0) 
{ 
    close(fd[0]);       //process1 doenst need to read from pipe 
    close(STD_INPUT);      //prepare for output 
    dup(fd[1]);        //Standard output = fd[1] 
    close(fd[1]); 
    execvp(parameter[0], parameter);  //Execute the process 
} 

else 
{ 
    proc2 = fork(); 
    if (proc2 == 0) 
    { 
     close(fd[1]); 
     close(STD_OUTPUT); 
     dup(fd[0]); 
     close(fd[0]); 
     execvp(parameter2[0], parameter2); 
    } 
     //Parent process 
    else 
    { 
    waitpid(-1, &status, 0);   //Wait for the child to be done 
    } 
} 

私は別の子プロセスの出力をリダイレクトしようとしていますが、私が実行したときので、私は、私は2番目の子プロセスにパイプで間違いを犯していますだと思います私が2番目の子プロセスを削除すると、プログラムは正常に実行されます(パイプは含まず、単純なfork:ls、ls -l、psなど)。

答えて

2

私が与えることができる最高の答えはBeej's Guide to Unix IPCです。

(彼はあなたが尋ねた質問に非常によく似た例を示しますセクション4.3、でかいま見...)

0

子プロセス1つのセットアップ、close(STD_INPUT); dup(fd[1]);で0で利用可能な最低の記述にfd[1]を複製します1(STD_OUTPUT)ではなく(STD_INPUT)です。代わりにSTD_OUTPUTを閉じたくないのですか?また、このシーケンスの代わりにdup2(fd[1], STD_OUTPUT)をお勧めします。それはあなたが望むものを行い、とにかくもっとはっきりしています。

同様に、子プロセス2は、おそらくSTD_INPUTが必要なSTD_OUTPUTを使用します。

関連する問題