+++ /dev/null
-import Posix
-import System(ExitCode(..), exitWith)
-
-main =
- forkProcess >>= \ maybe_pid ->
- case maybe_pid of
- Nothing -> raiseSignal floatingPointException
- _ -> doParent
-
-doParent =
- getAnyProcessStatus True False >>= \ (Just (pid, tc)) ->
- case tc of
- Terminated sig | sig == floatingPointException -> forkChild2
- _ -> fail (userError "unexpected termination cause")
-
-forkChild2 =
- forkProcess >>= \ maybe_pid ->
- case maybe_pid of
- Nothing -> exitImmediately (ExitFailure 42)
- _ -> doParent2
-
-doParent2 =
- getAnyProcessStatus True False >>= \ (Just (pid, tc)) ->
- case tc of
- Exited (ExitFailure 42) -> forkChild3
- _ -> fail (userError "unexpected termination cause (2)")
-
-forkChild3 =
- forkProcess >>= \ maybe_pid ->
- case maybe_pid of
- Nothing -> exitImmediately (ExitSuccess)
- _ -> doParent3
-
-doParent3 =
- getAnyProcessStatus True False >>= \ (Just (pid, tc)) ->
- case tc of
- Exited ExitSuccess -> forkChild4
- _ -> fail (userError "unexpected termination cause (3)")
-
-forkChild4 =
- forkProcess >>= \ maybe_pid ->
- case maybe_pid of
- Nothing -> raiseSignal softwareStop
- _ -> doParent4
-
-doParent4 =
- getAnyProcessStatus True True >>= \ (Just (pid, tc)) ->
- case tc of
- Stopped sig | sig == softwareStop -> enoughAlready pid
- _ -> fail (userError "unexpected termination cause (4)")
-
-enoughAlready pid =
- signalProcess killProcess pid >>
- getAnyProcessStatus True True >>= \ (Just (pid, tc)) ->
- case tc of
- Terminated sig | sig == killProcess -> putStr "I'm happy.\n"
- _ -> fail (userError "unexpected termination cause (5)")
-