1

シェルに単純な2ステージパイプを実装しようとしています。

2番目のフォークを実行せず、親でパイプの残りの実装を実行すると、正常に機能しますが、シェルを終了します。そのため、シェルを終了しないように2番目のフォークを実行します。しかし、何らかの理由で、上記のコードでは何も起こりません。何がうまくいかないのか理解するのを手伝ってもらえますか?両方のプロセスが終了するのを待たずに終了するように感じますが、間違っている可能性があります。

4

1 に答える 1

1

解決策:親でfd[0]閉じます。fd[1]

必要なツインフォークモデルでは、親プロセス(シェル)がそのコピーをfd[1]開いたままにします。これを開くと、子pid2は標準の入力fdでEOFを確認できなくなります。

コメント:

  1. 両方の子は、dup2'ing後にパイプfdsを閉じる必要があります
  2. 上記とパスティexecvpの両方の後のコードは、通常の状況では制御が返されると考えていることを示しています。そうではありません。このコードでは、せいぜいaと。を続けたいと思うでしょう。execvpexecvpperrorexit
于 2012-10-01T05:46:39.337 に答える