パイプがうまく動かない理由

前のエントリーに書いた、パイプがうまく動かない理由が分かった。pipe()を実行した後に、不必要なパイプをちゃんと閉じてないから、通信路がうまく設定できてなかったみたいです。

今は自作シェルに多段パイプを実装しているんですが、この場合

  • シェルプロセス(親プロセス)
    • pipe(int pfd[2])を実行
    • fork()
    • pfd[1](パイプ入力)をcloseして、子プロセスをwaitする
  • 子プロセス
    • dup2(pfd[1], 1)して、パイプへ出力するようにつなぎかえる
    • pfd[0]、pfd[1]をclose
    • コマンドを実行
  • シェルプロセス(親プロセス)
    • pfd[0](パイプ出力)から処理結果を読み込む
    • pfd[0]、pfd[1]をclose
    • 読み込んだ処理結果をバッファする
    • パイプされる次のコマンドは、バッファから読み込むようにする

でいいのかな。これだとシェルプロセスでバッファを用意しなければいけないからめんどくさい。うまくパイプ上のバッファを次のコマンドへつなぎかえられるといいんだけど。