pipe 動かない

(define (pipe3 cmd1 args1 cmd2 args2 cmd3 args3)
  (let-values ([(in1 out1) (%pipe)])
    (let-values ([(in2 out2) (%pipe)])
      (%spawn cmd1 args1 (list #f out1 #f))
      (%spawn cmd2 args2 (list in1 out2 #f))
      (%spawn cmd3 args3 (list in2 #f #f))
      (close-port in1)
      (close-port in2)
      (close-port out1)
      (close-port out2)
      (%waitpid -1)
      (%waitpid -1)
      (%waitpid -1)
)))

(pipe3 "ls" '("-la") "grep" '("cpp") "grep" '("main"))

2個目の waitpid でブロックされてしまう。man を拾い読みするだけでなく一度本を読んだ方が良さそうだ。

解決

(close-port out1) は out1 を使わないプロセスで直後に発行しないとだめ。