|Did you know ...||Search Documentation:|
|library(unix): Unix specific operations|
library(process)provides a portable high level interface to create and manage processes.
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.
fork() is the only way to create new processes and fork/1
is a simple direct interface to it.
permission_error(fork, process, main)is raised if the calling thread is not the only thread in the process. Forking a Prolog process with threads will typically deadlock because only the calling thread is cloned in the fork, while all thread synchronization are cloned.
fork_exec(Command) :- ( fork(child) -> exec(Command) ; true ).
execvp(). Here are some examples:
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
SIGprefix and mapping to lowercase. E.g.
intis the same as
SIGINTin 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_errorare closed if they are connected to a terminal (see
ttyproperty 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
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).
library(syslog)allows for sending output to the Unix logging service.
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:
nprocessors_onln. Note that not all values may be supported on all operating systems.