The SystemExts module contains functionality that goes beyond what the Haskell 98 module System provides. That is, functionality that provides access to the underlying OS' facilities in an OS-indepedent manner.
Notice that SystemExts shares the goal of System. That is, it aims to provide functionality that's supported by all platforms. So, if you're looking to do serious system programming for a particular (family) of platforms, you really want to check out the libraries provided for the platform in question as well. e.g., The Posix library for POSIX.1-conforming platforms, the Win32 library for Win32 platforms.
SystemExts exports the following:
rawSystem :: String -> IO ExitCode withArgs :: [String] -> IO a -> IO a withProgName :: String -> IO a -> IO a
rawSystem provides the exact same behaviour as System.system, except that the system command isn't invoked via an shell / command interpreter.
Not involving your platform's shell / command interpreter is quicker if you don't need its functionality, and it avoids running into limitations imposed by the shell / command interpreter. For instance, Win32 command interpreters place a limit on the length of the command they can execute (~4k), which sometimes gets in the way of what you want to do.
The withArgs action lets you change the value returned by System.getArgs while executing an IO action.
When the action has finished executing (or if it raises an exception), the argument vector of System.getArgs is restored.
The withProgName action lets you change the program name string returned by System.getProgName while executing an IO action.
As withArgs, when the action has finished executing (or if it raises an exception), the program name string System.getArgs is restored.