練習問題 exercise 12 の解答

親プロセスは子プロセスを待たなくてはいけませんが、そのまえに子プロセスが読み込むパイプへの入力を親が閉じる必要があります。これを閉じなかった場合子プロセスは次の整数が来るのを永遠に待つことになり、デッドロックを引き起こします (チャンネルを閉じると対応するディスクリプタのバッファが空になるので、データが失われることはありません)。具体的には sieve 関数の 10 行目を以下のようにします:

let output = out_channel_of_descr fd_out in generate len output; close_out output; ignore(waitpid [] p);;

そして filter 関数の 1216 行目 (... で表されている部分) を次のコードで覆います。

try ... with End_of_file -> close_out output; ignore (waitpid [] p)
* * *