Cum, 2009-06-19 tarihinde 13:09 +0200 saatinde, Deniz Dogan yazdı:
2009/6/19 Aycan iRiCAN
: Cum, 2009-06-19 tarihinde 12:42 +0200 saatinde, Deniz Dogan yazdı:
2009/6/19 Aycan iRiCAN
: Cum, 2009-06-19 tarihinde 11:58 +0200 saatinde, Deniz Dogan yazdı:
2009/6/18 Deniz Dogan
: 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@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, -- aycan