Quoth br...@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))

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to