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

2009-06-19 Thread Deniz Dogan
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

2009-06-19 Thread 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 ()


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-06-19 Thread Deniz Dogan
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

2009-06-19 Thread 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.

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-06-19 Thread Deniz Dogan
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

2009-06-19 Thread 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
> > 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-06-19 Thread Deniz Dogan
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