| Haskell Hierarchical Libraries (unix package) | Source code | Contents | Index

System.Posix.Process

Portability | non-portable (requires POSIX)
Stability | provisional
Maintainer | libraries@haskell.org

Contents

Processes
  Forking and executing
  Exiting
  Process environment
  Process groups
  Sessions
  Process times
  Scheduling priority
  Process status

Description
POSIX process support
Synopsis

forkProcess :: IO () -> IO ProcessID
executeFile :: FilePath -> Bool -> [String] -> Maybe [(String, String)] -> IO ()
exitImmediately :: ExitCode -> IO ()
getProcessID :: IO ProcessID
getParentProcessID :: IO ProcessID
getProcessGroupID :: IO ProcessGroupID
createProcessGroup :: ProcessID -> IO ProcessGroupID
joinProcessGroup :: ProcessGroupID -> IO ()
setProcessGroupID :: ProcessID -> ProcessGroupID -> IO ()
createSession :: IO ProcessGroupID

data ProcessTimes = ProcessTimes {

elapsedTime :: ClockTick
userTime :: ClockTick
systemTime :: ClockTick
childUserTime :: ClockTick
childSystemTime :: ClockTick

}

getProcessTimes :: IO ProcessTimes
nice :: Int -> IO ()
getProcessPriority :: ProcessID -> IO Int
getProcessGroupPriority :: ProcessGroupID -> IO Int
getUserPriority :: UserID -> IO Int
setProcessPriority :: ProcessID -> Int -> IO ()
setProcessGroupPriority :: ProcessGroupID -> Int -> IO ()
setUserPriority :: UserID -> Int -> IO ()

data ProcessStatus

= Exited ExitCode
| Terminated Signal
| Stopped Signal

getProcessStatus :: Bool -> Bool -> ProcessID -> IO (Maybe ProcessStatus)
getAnyProcessStatus :: Bool -> Bool -> IO (Maybe (ProcessID, ProcessStatus))
getGroupProcessStatus :: Bool -> Bool -> ProcessGroupID -> IO (Maybe (ProcessID, ProcessStatus))

Processes
Forking and executing
forkProcess :: IO () -> IO ProcessID

`forkProcess` corresponds to the POSIX `fork` system call. The `IO` action passed as an argument is executed in the child process; no other threads will be copied to the child process. On success, `forkProcess` returns the child's `ProcessID` to the parent process; in case of an error, an exception is thrown.

`forkProcess` comes with a giant warning: since any other running threads are not copied into the child process, it's easy to go wrong: e.g. by accessing some shared resource that was held by another thread in the parent. Another example is the I/O manager thread: since the I/O manager isn't running in the child, attempting to do any Handle-based I/O will deadlock.

Using `forkProcess` in order to do `executeFile` is likely to work. Anything else: you're on your own.

executeFile

:: FilePath | Command
-> Bool | Search PATH?
-> [String] | Arguments
-> Maybe [(String, String)] | Environment
-> IO () |

``executeFile` cmd args env` calls one of the `execv*` family, depending on whether or not the current PATH is to be searched for the command, and whether or not an environment is provided to supersede the process's current environment. The basename (leading directory names suppressed) of the command is passed to `execv*` as `arg[0]`; the argument list passed to `executeFile` therefore begins with `arg[1]`.

Exiting
exitImmediately :: ExitCode -> IO ()
``exitImmediately` status` calls `_exit` to terminate the process with the indicated exit `status`. The operation never returns.
Process environment
getProcessID :: IO ProcessID
`getProcessID` calls `getpid` to obtain the `ProcessID` for the current process.
getParentProcessID :: IO ProcessID
`getProcessID` calls `getppid` to obtain the `ProcessID` for the parent of the current process.
getProcessGroupID :: IO ProcessGroupID
`getProcessGroupID` calls `getpgrp` to obtain the `ProcessGroupID` for the current process.
Process groups
createProcessGroup :: ProcessID -> IO ProcessGroupID
``createProcessGroup` pid` calls `setpgid` to make process `pid` a new process group leader.
joinProcessGroup :: ProcessGroupID -> IO ()
``joinProcessGroup` pgid` calls `setpgid` to set the `ProcessGroupID` of the current process to `pgid`.
setProcessGroupID :: ProcessID -> ProcessGroupID -> IO ()
``setProcessGroupID` pid pgid` calls `setpgid` to set the `ProcessGroupID` for process `pid` to `pgid`.
Sessions
createSession :: IO ProcessGroupID
`createSession` calls `setsid` to create a new session with the current process as session leader.
Process times
data ProcessTimes

Constructors

ProcessTimes |

elapsedTime :: ClockTick |
userTime :: ClockTick |
systemTime :: ClockTick |
childUserTime :: ClockTick |
childSystemTime :: ClockTick |

getProcessTimes :: IO ProcessTimes
`getProcessTimes` calls `times` to obtain time-accounting information for the current process and its children.
Scheduling priority
nice :: Int -> IO ()
getProcessPriority :: ProcessID -> IO Int
getProcessGroupPriority :: ProcessGroupID -> IO Int
getUserPriority :: UserID -> IO Int
setProcessPriority :: ProcessID -> Int -> IO ()
setProcessGroupPriority :: ProcessGroupID -> Int -> IO ()
setUserPriority :: UserID -> Int -> IO ()
Process status
data ProcessStatus

Constructors

Exited ExitCode |
Terminated Signal |
Stopped Signal |

Instances

Eq ProcessStatus
Ord ProcessStatus
Show ProcessStatus

getProcessStatus :: Bool -> Bool -> ProcessID -> IO (Maybe ProcessStatus)
``getProcessStatus` blk stopped pid` calls `waitpid`, returning ``Just` tc`, the `ProcessStatus` for process `pid` if it is available, `Nothing` otherwise. If `blk` is `False`, then `WNOHANG` is set in the options for `waitpid`, otherwise not. If `stopped` is `True`, then `WUNTRACED` is set in the options for `waitpid`, otherwise not.
getAnyProcessStatus :: Bool -> Bool -> IO (Maybe (ProcessID, ProcessStatus))
``getAnyProcessStatus` blk stopped` calls `waitpid`, returning ``Just` (pid, tc)`, the `ProcessID` and `ProcessStatus` for any child process if one is available, `Nothing` otherwise. If `blk` is `False`, then `WNOHANG` is set in the options for `waitpid`, otherwise not. If `stopped` is `True`, then `WUNTRACED` is set in the options for `waitpid`, otherwise not.
getGroupProcessStatus :: Bool -> Bool -> ProcessGroupID -> IO (Maybe (ProcessID, ProcessStatus))
``getGroupProcessStatus` blk stopped pgid` calls `waitpid`, returning ``Just` (pid, tc)`, the `ProcessID` and `ProcessStatus` for any process in group `pgid` if one is available, `Nothing` otherwise. If `blk` is `False`, then `WNOHANG` is set in the options for `waitpid`, otherwise not. If `stopped` is `True`, then `WUNTRACED` is set in the options for `waitpid`, otherwise not.
Produced by Haddock version 0.8