[Haskell-cafe] Re: Running a sub-process which dies with the main program
2009/6/18 Deniz Dogan deniz.a.m.do...@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. However, I would really like some more control over what file descriptors the subprocess should use (specifically stdout and stderr). Looking at the source code for System.Process.system, I find that it uses the syncProcess function, which would be useful to me, but isn't exported. So why is syncProcess not exported? Is there any good reason not to? -- Deniz Dogan ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: Running a sub-process which dies with the main program
Cum, 2009-06-19 tarihinde 11:58 +0200 saatinde, Deniz Dogan yazdı: 2009/6/18 Deniz Dogan deniz.a.m.do...@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 () Regards, -- aycan ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: Running a sub-process which dies with the main program
2009/6/19 Aycan iRiCAN aycan.iri...@core.gen.tr: Cum, 2009-06-19 tarihinde 11:58 +0200 saatinde, Deniz Dogan yazdı: 2009/6/18 Deniz Dogan deniz.a.m.do...@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. Looking at the source code for system, we see that it uses syncProcess, which has #ifdef mingw32_HOST_OS (IIRC) in which the code you gave me resides. If mingw32_HOST_OS is not defined, one has to go through quite a bit more trouble to get the same effect. This is why it bugs me a bit that syncProcess is not exported. I can't find any reason not to export it, but what do I know? -- Deniz Dogan ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: Running a sub-process which dies with the main program
Cum, 2009-06-19 tarihinde 12:42 +0200 saatinde, Deniz Dogan yazdı: 2009/6/19 Aycan iRiCAN aycan.iri...@core.gen.tr: Cum, 2009-06-19 tarihinde 11:58 +0200 saatinde, Deniz Dogan yazdı: 2009/6/18 Deniz Dogan deniz.a.m.do...@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. ay...@aycan:~/haskell$ time ./deniz2 ps -ef | grep sleep ^C real0m0.707s user0m0.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. Best Regards, -- aycan ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: Running a sub-process which dies with the main program
2009/6/19 Aycan iRiCAN aycan.iri...@core.gen.tr: Cum, 2009-06-19 tarihinde 12:42 +0200 saatinde, Deniz Dogan yazdı: 2009/6/19 Aycan iRiCAN aycan.iri...@core.gen.tr: Cum, 2009-06-19 tarihinde 11:58 +0200 saatinde, Deniz Dogan yazdı: 2009/6/18 Deniz Dogan deniz.a.m.do...@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. ay...@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 real0m10.005s user0m0.003s sys 0m0.003s deniz14095 14047 0 13:05 pts/100:00:00 grep sleep What's strange though is that when I hit C-c *twice*, I get this behavior: time ./test ps -ef | grep sleep ^C^C real0m0.915s user0m0.003s sys 0m0.000s This is with GHC 6.10.3 on Arch Linux i686. -- Deniz Dogan ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: Running a sub-process which dies with the main program
Cum, 2009-06-19 tarihinde 13:09 +0200 saatinde, Deniz Dogan yazdı: 2009/6/19 Aycan iRiCAN aycan.iri...@core.gen.tr: Cum, 2009-06-19 tarihinde 12:42 +0200 saatinde, Deniz Dogan yazdı: 2009/6/19 Aycan iRiCAN aycan.iri...@core.gen.tr: Cum, 2009-06-19 tarihinde 11:58 +0200 saatinde, Deniz Dogan yazdı: 2009/6/18 Deniz Dogan deniz.a.m.do...@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. ay...@aycan:~/haskell$ time ./deniz2 ps -ef | grep sleep ^C real0m0.707s user0m0.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 deniz14095 14047 0 13:05 pts/100: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 ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Re: Running a sub-process which dies with the main program
2009/6/19 Aycan iRiCAN aycan.iri...@core.gen.tr: Cum, 2009-06-19 tarihinde 13:09 +0200 saatinde, Deniz Dogan yazdı: 2009/6/19 Aycan iRiCAN aycan.iri...@core.gen.tr: Cum, 2009-06-19 tarihinde 12:42 +0200 saatinde, Deniz Dogan yazdı: 2009/6/19 Aycan iRiCAN aycan.iri...@core.gen.tr: Cum, 2009-06-19 tarihinde 11:58 +0200 saatinde, Deniz Dogan yazdı: 2009/6/18 Deniz Dogan deniz.a.m.do...@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. ay...@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 ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe