私はシェルを作成する必要がある割り当てに取り組んでいます。私は自分のプロセスでほとんどのコマンドを実行する必要があります。しかし、すべての子プロセス間にパイプを実装する必要があるときには、問題が発生します。パイプを子プロセスに接続する
私が今まで理解してきたことは、親プロセス内のすべてのパイプを作成してから、パイプを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つのパイプが必要ですか?私はどこか間違って考えていますか?
あなたは
4つのコマンドをチェーンするには3本のパイプが必要です。 – eckes
上記の例に詳しく説明してください。 @eckes – Cows42
あなたの例では、fd [3] doubleを使用しています。 fd [0]〜fd [5]を使用すると、3つのパイプで6つのfdsが得られます。あなたのコマンドで使用するのと同じ3つのパイプシンボル。 – eckes