[Haskell-cafe] Re: Running a "sub-process" which dies with the main program

Deniz Dogan deniz.a.m.dogan at gmail.com
Fri Jun 19 08:07:01 EDT 2009


2009/6/19 Aycan iRiCAN <aycan.irican at core.gen.tr>:
>
> Cum, 2009-06-19 tarihinde 13:09 +0200 saatinde, Deniz Dogan yazdı:
>> 2009/6/19 Aycan iRiCAN <aycan.irican at core.gen.tr>:
>> >
>> > Cum, 2009-06-19 tarihinde 12:42 +0200 saatinde, Deniz Dogan yazdı:
>> >> 2009/6/19 Aycan iRiCAN <aycan.irican at core.gen.tr>:
>> >> >
>> >> > Cum, 2009-06-19 tarihinde 11:58 +0200 saatinde, Deniz Dogan yazdı:
>> >> >> 2009/6/18 Deniz Dogan <deniz.a.m.dogan at gmail.com>:
>> >> >> > Hi
>> >> >> >
>> >> >> > I couldn't come up with a better subject than this one, so anyways...
>> >> >> >
>> >> >> > I have a small program which spawns a subprocess. However, when I hit
>> >> >> > C-c, the subprocess won't die, instead it will just keep running until
>> >> >> > it's done or until I kill it. I've looked around in System.Process for
>> >> >> > something suitable for my needs, but I can't seem to find it. Any
>> >> >> > ideas?
>> >> >>
>> >> >> With a tip from a person outside of the mailing list I found
>> >> >> System.Process.system, which essentially does exactly what I was
>> >> >> asking for.
>> >> >
>> >> > Hey I'm already subscribed :) You can read from "sout" and "serr" with
>> >> > below example. Hope that it helps.
>> >> >
>> >> >
>> >> > module Main where
>> >> >
>> >> > import System.Process  -- using process-1.0.1.1
>> >> >
>> >> > main = do
>> >> >  (_, sout, serr, p) <- createProcess (proc "sleep" ["10"])
>> >> >                        { std_out = CreatePipe
>> >> >                        , std_err = CreatePipe }
>> >> >  r <- waitForProcess p
>> >> >  return ()
>> >> >
>> >>
>> >> Thanks!
>> >>
>> >> But this was the approach I used before I went to
>> >> System.Process.system and it did not work on my Linux machine.
>> >
>> > Give it a try. Try to send CTRL-C and look if "sleep 10" (which is a
>> > subprocess) process terminates.
>> >
>> > aycan at aycan:~/haskell$ time ./deniz2 && ps -ef | grep sleep
>> > ^C
>> > real    0m0.707s
>> > user    0m0.001s
>> > sys     0m0.004s
>> >   aycan 13098  4430   0 13:50:23 pts/7       0:00 grep sleep
>> >
>> > It terminates with ghc 6.10.3 on OpenSolaris.
>>
>> This is copied verbatim from my terminal. I used the exact some code
>> that you gave me.
>>
>> % time ./test && ps -ef | grep sleep
>> ^C
>> real  0m10.005s
>> user  0m0.003s
>> sys   0m0.003s
>> deniz    14095 14047  0 13:05 pts/1    00:00:00 grep sleep
>>
>> What's strange though is that when I hit C-c *twice*, I get this behavior:
>
> Hmm, I think GHC RTS handles SIGINT. I recompiled with thread support and got the same behavour.
>
> See: http://hackage.haskell.org/trac/ghc/wiki/Commentary/Rts/Signals
>
>        When the interrupt signal is received, the default behaviour of
>        the runtime is to attempt to shut down the Haskell program
>        gracefully. It does this by calling interruptStgRts() in
>        rts/Schedule.c (see Commentary/Rts/Scheduler#ShuttingDown). If a
>        second interrupt signal is received, then we terminate the
>        process immediately; this is just in case the normal shutdown
>        procedure failed or hung for some reason, the user is always
>        able to stop the process with two control-C keystrokes.
>
> You better install signal handlers using installHandler.
>
> Best Regards,

But that's what syncProcess does when mingw32_HOST_OS is not defined.
Also, compiling without -threaded doesn't help the problem on my
machine, it still acts the same.

-- 
Deniz Dogan


More information about the Haskell-Cafe mailing list