2017-09-24 9 views
0

私はシェルを作成する必要がある割り当てに取り組んでいます。私は自分のプロセスでほとんどのコマンドを実行する必要があります。しかし、すべての子プロセス間にパイプを実装する必要があるときには、問題が発生します。パイプを子プロセスに接続する

私が今まで理解してきたことは、親プロセス内のすべてのパイプを作成してから、パイプをSTDIN/STDOUTに複製する必要があることです。 |

シェル$>猫file.txtを:

int count = 2 * amountOfCommands 
int fd[count]; 
for (int i = 0; i < count; i++) { 
    pipe(fd); //I have error checking, but I left it out here. 
} 

私たちは、この例のためのパイプを作成するつもりされていると仮定しましょう:だから私はこのようなコマンドごとに新しいパイプを作成する関数を作りましたgrep 'pattern1' | grep 'pattern2' |トイレ-l

これは、我々は4本のパイプを作成し、そのカウントことを意味は8だろう。しかし、私は、コピー部にわからないよ、それはこのように終わるん:ここで

私がいることを前提とし0 STDIN_FILENO、1はSTDOUT_FILNO、2であるはい、私はパイプの残りの部分で何をすべき場合はSTDERR

cat file.txt 
0: STDIN 
1: fd[1] //WRITE 

grep 'pattern1' 
0: fd[0] //READ from cat 
1: fd[3] //WRITE 

grep 'pattern2' 
0: fd[2] //READ from grep 
1: fd[5] //WRITE 

wc -l 
0: fd[4] //READ from grep 
1: STDOUT 

のですか?私は4を作成したので、4つのREADと4つのWRITEが必要です。しかし、私はそれらを一緒に接続すると、私は2つのパイプが必要ですか?私はどこか間違って考えていますか?

あなたは

+0

4つのコマンドをチェーンするには3本のパイプが必要です。 – eckes

+0

上記の例に詳しく説明してください。 @eckes – Cows42

+0

あなたの例では、fd [3] doubleを使用しています。 fd [0]〜fd [5]を使用すると、3つのパイプで6つのfdsが得られます。あなたのコマンドで使用するのと同じ3つのパイプシンボル。 – eckes

答えて

0

あなたはnコマンドのn-1のパイプが必要ありがとうございます。パイプを作成するために反復処理を行うときは、各呼び出しに新しい2要素のint配列(オフセット)を与える必要があります:

+0

ああ、ありがとう! – Cows42

関連する問題