パイプを使用して 2 つの Prolog プロセスを通信していますが、パイプからメッセージを読み取る述語に到達するたびにread/2
、プログラムがブロックされ、そのままでした。なぜそうなったのか理解できませんでしたが (非常に単純なプログラムで試しました)、最終的に次の 3 つのことに気付きました。
write/2
を使用してメッセージを送信するたびに、送信者プロセスはそのメッセージを で終了する必要があります.\n
。メッセージがこのように終わらない場合、受信プロセスはread/2
述語でスタックします。- 送信者が出力をフラッシュしない場合、メッセージはパイプ バッファに残されません。当たり前のように思えるかもしれませんが、最初はそうではありませんでした。
- メッセージがフラッシュされていない場合
read/2
はブロックされていますが、wait_for_input/3
まったくブロックされていないためflush_output/1
、そのような場合は必要ありません。
例:
これは動作しません:
example1 :-
pipe(R,W),
write(W,hello),
read(R,S). % The program is blocked here.
それも機能しません:
example2 :-
pipe(R,W),
write(W,'hello.\n'),
read(R,S). % The program is blocked here.
これら2つが機能している間:
example3 :-
pipe(R,W),
write(W,'hello.\n'),
flush_output(W),
read(R,S).
example4 :-
pipe(R,W),
write(W,'hello.\n'),
wait_for_input([W],L,infinite).
今私の質問はなぜですか?Prolog がパイプからの読み取り時にピリオドで終わる行全体を「受け入れる」だけである理由はありますか (実際には、読み取りたいストリームから読み取ります)。read
そして、ブロックしないのにブロックするのはなぜwait_for_input/3
ですか (メッセージがフラッシュされていないと仮定して)?
ありがとう!