
Quoth brian@lorf.org,
On Tuesday, 14.04.09 at 22:13, Lennart Augustsson wrote:
So the right way to do this (like opening a file), is to try executing it and let the OS tell you if it failed.
I know, but the various functions that create processes don't help me know whether the program actually ran or not. For example,
createProcess (proc "nosuch" []) >>= \(_,_,_,ph) -> waitForProcess ph
returns ExitCode 127. If I use the same code to run 'test', a C program that returns 127, I get the same thing.
Right, awkward problem. Don't know if it can be solved in a portable way, but you (as author of a createProcess-like function) can use a pipe from the forked process. The code demo I append works, given FFI support for the POSIX functions it uses, but may not be appropriate for use with GHC (I'm using nhc98.) Donn ------------ spawn file cmd env = do (e0, e1) <- pipe -- F_CLOEXEC: close fd on (sucessful) exec. fcntlSetFlag e1 F_CLOEXEC t <- fork (fex e0 e1) close e1 rx <- readFd e0 256 if null rx then return t else ioError (userError rx) where fex e0 e1 = do close e0 catch (execve file cmd env) (\ e -> writeFd e1 (ioeGetErrorString e))