1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
fun statusToString status =
case status of
Posix.Process.W_EXITED => "W_EXITED"
| Posix.Process.W_EXITSTATUS w => concat ["W_EXITSTATUS ", Word8.toString w]
| Posix.Process.W_SIGNALED s =>
concat ["W_SIGNALED ", SysWord.toString (Posix.Signal.toWord s)]
| Posix.Process.W_STOPPED s =>
concat ["W_STOPPED ", SysWord.toString (Posix.Signal.toWord s)]
val cmd = CommandLine.name ()
fun stdout () =
TextIO.output (TextIO.stdOut, "Hello world! [stdout]\n")
fun exit () = Posix.Process.exit 0wx7
fun diverge () = diverge ()
fun test () =
let
fun create arg =
let
val _ = TextIO.flushOut (TextIO.stdOut)
val _ = TextIO.flushOut (TextIO.stdErr)
in
MLton.Process.create
{path = cmd,
args = [arg],
env = NONE,
stdin = MLton.Process.Param.self,
stdout = MLton.Process.Param.self,
stderr = MLton.Process.Param.self}
end
fun reap pid =
MLton.Process.reap pid
fun kill (pid, signal) =
MLton.Process.kill (pid, signal)
fun doTest (arg, withPid) =
let
val _ = print (concat ["testing ", arg, "...\n"])
val pid = create arg
val () = withPid pid
val status = reap pid
val _ = print (concat ["exit_status: ", statusToString status, "\n"])
in
()
end
fun doSimpleTest arg = doTest (arg, fn _ => ())
in
print "create test:\n"
; doSimpleTest "stdout"
; doSimpleTest "exit"
; doTest ("diverge", fn pid => kill (pid, Posix.Signal.kill))
end
val _ =
case CommandLine.arguments () of
[] => test ()
| ["stdout"] => stdout ()
| ["exit"] => exit ()
| ["diverge"] => diverge ()
| _ => raise Match
|