シェルに単純な2ステージパイプを実装しようとしています。
2番目のフォークを実行せず、親でパイプの残りの実装を実行すると、正常に機能しますが、シェルを終了します。そのため、シェルを終了しないように2番目のフォークを実行します。しかし、何らかの理由で、上記のコードでは何も起こりません。何がうまくいかないのか理解するのを手伝ってもらえますか?両方のプロセスが終了するのを待たずに終了するように感じますが、間違っている可能性があります。
シェルに単純な2ステージパイプを実装しようとしています。
2番目のフォークを実行せず、親でパイプの残りの実装を実行すると、正常に機能しますが、シェルを終了します。そのため、シェルを終了しないように2番目のフォークを実行します。しかし、何らかの理由で、上記のコードでは何も起こりません。何がうまくいかないのか理解するのを手伝ってもらえますか?両方のプロセスが終了するのを待たずに終了するように感じますが、間違っている可能性があります。
解決策:親でfd[0]
閉じます。fd[1]
必要なツインフォークモデルでは、親プロセス(シェル)がそのコピーをfd[1]
開いたままにします。これを開くと、子pid2
は標準の入力fdでEOFを確認できなくなります。
コメント:
execvp
の両方の後のコードは、通常の状況では制御が返されると考えていることを示しています。そうではありません。このコードでは、せいぜいaと。を続けたいと思うでしょう。execvp
execvp
perror
exit