パイプを使用して 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ですか (メッセージがフラッシュされていないと仮定して)?
ありがとう!