truly fork, sort of

This commit is contained in:
Simon Forman
2019-08-18 10:53:25 -07:00
parent 11fdc81409
commit 2057d9ee74
4 changed files with 43 additions and 3 deletions
+41
View File
@@ -0,0 +1,41 @@
:- multifile(func/3).
func(fork, [F, G|S], [X, Y|S]) :-
fork(F, S, X, ChildPID),
thun(G, S, [Y|_]),
wait(ChildPID, Status). % FIXME check status!!!
fork(Expr, Stack, Result, ChildPID) :-
mkpipe(In, Out),
fork_prolog(ChildPID),
bar(ChildPID, In, Out, Expr, Stack, Result).
bar(0, In, Out, Expr, Stack, Result) :-
close(In),
thun(Expr, Stack, [Result|_]),
w(Out, Result),
close(Out),
halt.
bar(P, In, Out, Expr, Stack, Result) :-
integer(P), P =\= 0,
close(Out),
select([In], R, [], _, 1500),
(R=[In] ->
read(In, Result)
;
Result=timeout
),
close(In).
mkpipe(In, Out) :-
create_pipe(In, Out),
set_stream_buffering(Out, none),
set_stream_buffering(In, none).
w(Out, Term) :- % To get a term written out and recognized,
write(Out, Term), % you write it to the stream
put_code(Out, 0'.), % add a period at the end
nl(Out), % and a newline even if you set buffering
flush_output(Out). % to none, then flush for good measure.