module system/posix/process-abstractions
imports
system/posix/process
system/posix/signal
util/log
/**
* Fork abstractions
*/
strategies
/**
* Executes "child" in the child process and returns a tuple
* of the pid of the child process and the current term in the
* parent process.
*/
fork(child) =
fork(child, id)
fork(child, parent) =
?t; fork; ?pid; (?0 < <child> t + <parent> (pid, t))
fork-and-wait(child) =
fork(child, ?(<waitpid>, t); warn-ifsignaled; ?WaitStatus(0,_,_); !t)
/**
* Call abstractions
*/
strategies
/**
* Call a program with list of string arguments.
*
* @type (String, List(String)) -> (String, List(String))
*/
call =
call(id)
call(init-child) =
?(prog,args)
; fork-and-wait(init-child; <execvp> (prog, args); <exit> 1)
/**
* Call program with a list of strings arguments and print
* information to stderr.
*
* @type (String, List(String)) -> (String, List(String))
*/
call-noisy =
?(prog,args)
; fork-and-wait(<debug; execvp> (prog, args))
/**
* Termination abstractions
*/
strategies
/**
* Succeeds if the process of this WaitStatus exited.
*
* @type WaitStatus -> WaitStatus
*/
exited =
?WaitStatus(s,_,_)
; where(<not(eq)> (s, -1))
; if-verbose3(debug(!"the process exited: "))
/**
* Succeeds if the process of this WaitStatus was signaled.
*
* @type WaitStatus -> WaitStatus
*/
signaled =
?WaitStatus(_,s,_)
; where(<not(eq)> (s, -1))
; if-verbose2(debug(!"the process was signaled"))
/**
* Succeeds if the process of this WaitStatus was stopped.
*
* @type WaitStatus -> WaitStatus
*/
stopped =
?WaitStatus(_,_,s)
; where(<not(eq)> (s, -1))
; if-verbose3(debug(!"the process stopped"))
/**
* Prints a warning if the process of this WaitStatus was signaled.
*
* @type WaitStatus -> WaitStatus
*/
warn-ifsignaled =
where(try(
?WaitStatus(_, <id>, _)
; not(?-1)
; signal-from-number
; signal-to-descr
; log(|Warning(),<concat-strings>["process signaled: ",<id>])
))
/**
* Execute program in a new process with list of string args,
* with the specified exec strategy.
*
* Optionally you can define file descriptors to use for stdin, stdout,
* stderr.
*
* @param opt-fdin Option(FileDescr)
* @param opt-fdout Option(FileDescr)
* @param opt-fderr Option(FileDescr)
*
* @type (String, List(String)) -> ()
*/
call(|opt-fdin, opt-fdout, opt-fderr) =
?(prog, args)
; fork-and-wait(
<option(<dup2> (<id>, <STDIN_FILENO> ))> opt-fdin
; <option(<dup2> (<id>, <STDOUT_FILENO>))> opt-fdout
; <option(<dup2> (<id>, <STDERR_FILENO>))> opt-fderr
; <execvp> (prog, args)
; <exit> 1
)
; !()