Unix structure
signature UNIX (* OPTIONAL *)
structure Unix :> UNIX (* OPTIONAL *)
The Unix structure provides several high-level functions for creating and communicating with separate processes, in analogy with the popen interface provided in the Unix operating system. This module provides a more flexible interface than that provided by the OS.Process.system function. Using this module, a program can invoke a separate process and obtain input and output streams connected to the standard output and input streams, respectively, of the other process.
type ('a,'b) proc
type signal
datatype exit_status
= W_EXITED
| W_EXITSTATUS of Word8.word
| W_SIGNALED of signal
| W_STOPPED of signal
val fromStatus : OS.Process.status -> exit_status
val executeInEnv : string * string list * string list
-> ('a, 'b) proc
val execute : string * string list -> ('a, 'b) proc
val textInstreamOf : (TextIO.instream, 'a) proc
-> TextIO.instream
val binInstreamOf : (BinIO.instream, 'a) proc
-> BinIO.instream
val textOutstreamOf : ('a, TextIO.outstream) proc
-> TextIO.outstream
val binOutstreamOf : ('a, BinIO.outstream) proc
-> BinIO.outstream
val streamsOf : (TextIO.instream, TextIO.outstream) proc
-> TextIO.instream * TextIO.outstream
val reap : ('a, 'b) proc -> OS.Process.status
val kill : ('a, 'b) proc * signal -> unit
val exit : Word8.word -> 'a
type ('a,'b) proc
type signal
Posix module would probably equate the signal and Posix.Signal.signal types.
datatype exit_status
= W_EXITED
| W_EXITSTATUS of Word8.word
| W_SIGNALED of signal
| W_STOPPED of signal
W_EXITSTATUS will be non-zero.
If an implementation provides both the Posix and Unix structures, then Posix.Process.exit_status and exit_status must be the same type.
fromStatus sts
executeInEnv (cmd, args, env)
proc value naming the child process. Strings in the env list typically have the form "name=value" (see OS.Process.getEnv).
The executeInEnv function raises the OS.SysErr exception if it fails. Reasons for failure include insufficient memory, too many processes, and the case where cmd does not name an executable file. If the child process fails to execute the command (i.e., the execve call fails), then it should exit with a status code of 126.
execute (cmd, args)
proc value naming the child process. The failure semantics of this function are the same as for executeInEnv.
For implementations providing the Posix modules, this function is equivalent to
fun execute (cmd, args) =
executeInEnv (cmd, args, Posix.ProcEnv.environ ())
textInstreamOf pr
binInstreamOf pr
instream connected to the standard output stream of the process pr.
Note that multiple calls to these functions on the same proc value will result in multiple streams that all share the same underlying open file descriptor, which can lead to unpredictable effects because of the state inherent in file descriptors.
textOutstreamOf pr
binOutstreamOf pr
outstream connected to the standard input stream of the process pr.
Note that multiple calls to these functions on the same proc value will result in multiple streams that all share the same underlying open file descriptor, which can lead to unpredictable effects due to buffering.
streamsOf pr
(textInstream pr, textOutstream pr) and is provided for backward compatibility.
reap pr
reap is applied again to pr, it should immediately return the previous exit status.
Implementation note:
Typically, one cannot rely on the underlying operating system to provide the exit status of a terminated process after it has done so once. Thus, the exit status probably needs to be cached. Also note that
reapshould not return until the process being monitored has terminated. In particular, implementations should be careful not to return if the process has only been suspended.
kill (pr,s)
exit st
OS.Process.atExit, flushes and closes all I/O streams opened using the Library, then terminates the SML process with termination status st.
BinIO,OS.Process,Posix,Posix.ProcEnv,Posix.Process,Posix.Signal,TextIO
Note that the interpretation of the string cmd in the execute and executeInEnv functions depends very much on the underlying operating system. Typically, the cmd argument will be a full pathname.
The semantics of Unix necessitates that processes that have terminated need to be reaped. If this is not done, information concerning the dead process continues to reside in system tables. Thus, a program using execute or executeInEnv should invoke reap on any subprocess it creates.
Implementation note:
Although the flavor of this module is heavily influenced by Unix, and the module is simple to implement given the
Posixsubsystem, the functions are specified at a sufficiently high-level that implementations, including non-Unix ones, could provide this module without having to supply all of thePosixmodules.
Generated April 12, 2004
Last Modified May 9, 2003
Comments to John Reppy.
This document may be distributed freely over the internet as long as the copyright notice and license terms below are prominently displayed within every machine-readable copy.
|
Copyright © 2004 AT&T and Lucent Technologies. All rights reserved.
Permission is granted for internet users to make one paper copy for their
own personal use. Further hardcopy reproduction is strictly prohibited.
Permission to distribute the HTML document electronically on any medium
other than the internet must be requested from the copyright holders by
contacting the editors.
Printed versions of the SML Basis Manual are available from Cambridge
University Press.
To order, please visit
www.cup.org (North America) or
www.cup.cam.ac.uk (outside North America). |