[Haskell-cafe] Re: Running a "sub-process" which dies with the main program
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. 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 : > > 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 : > > 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. 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 : > > > > 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. 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 : > > 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. > > 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 : > > > > 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. > > > > 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 : > > 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. >> > >> > 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