The library(unix) library provides the commonly used Unix primitives to deal with process management. These primitives are useful for many tasks, including server management, parallel computation, exploiting and controlling other processes, etc.
The predicates in this library are modelled closely after their native Unix counterparts.
Unix fork()
is the only way to create new processes and fork/1
is a simple direct interface to it.
fork_exec(Command) :- ( fork(child) -> exec(Command) ; true ).
execvp()
. Here are some
examples:
exec(ls('-l'))
exec('/bin/ls'('-l', '/home/jan'))
Unix exec()
is the only way to start an executable file
executing. It is commonly used together with fork/1. For example
to start netscape on an URL in the background, do:
run_netscape(URL) :- ( fork(child), exec(netscape(URL)) ; true ).
Using this code, netscape remains part of the process-group of the invoking Prolog process and Prolog does not wait for netscape to terminate. The predicate wait/2 allows waiting for a child, while detach_IO/0 disconnects the child as a deamon process.
exited(ExitCode)
if the child with pid Pid was terminated by
calling exit()
(Prolog halt/1). ExitCode is the return status.
Status is unified with signaled(Signal)
if the child died due to
a software interrupt (see kill/2). Signal contains the signal
number. Finally, if the process suspended execution due to a
signal, Status is unified with stopped(Signal)
.SIG
prefix and mapping to lowercase. E.g. int
is the same as
SIGINT
in C. The meaning of the signal numbers can be found in
the Unix manual.:- use_module(library(unix)). fork_demo(Result) :- pipe(Read, Write), fork(Pid), ( Pid == child -> close(Read), format(Write, '~q.~n', [hello(world)]), flush_output(Write), halt ; close(Write), read(Read, Result), close(Read) ).
dup2()
, copying the underlying filedescriptor
and thus making both streams point to the same underlying
object. This is normally used together with fork/1 and pipe/2 to
talk to an external program that is designed to communicate
using standard I/O.
Both FromStream and ToStream either refer to a Prolog stream or
an integer descriptor number to refer directly to OS
descriptors. See also demo/pipe.pl
in the source-distribution of
this package.
user_input
, user_output
and
user_error
are closed if they are connected to a terminal
(see tty
property in stream_property/2). Input streams are
rebound to a dummy stream that returns EOF. Output streams are
reboud to forward their output to Stream.setsid()
if
provided or using ioctl()
TIOCNOTTY
on /dev/tty
.To ignore all output, it may be rebound to a null stream. For example:
..., open_null_stream(Out), detach_IO(Out).
The detach_IO/1 should be called only once per process. Subsequent calls silently succeed without any side effects.
/tmp/pl-out.<pid>
. Output is line buffered (see
set_stream/2).
sysconf(1)
for details. Conf is
a term Config(Value), where Value is always an integer. Config
is the sysconf()
name after removing =_SC_= and conversion to
lowercase. Currently support the following configuration info:
arg_max
, child_max
, clk_tck
, open_max
, pagesize
,
phys_pages
, avphys_pages
, nprocessors_conf
and
nprocessors_onln
. Note that not all values may be supported on
all operating systems.The following predicates are exported, but not or incorrectly documented.