Re: [Haskell-cafe] How to waitForProcess?

2012-09-04 Thread Brandon Allbery
On Tue, Sep 4, 2012 at 9:39 PM, Mike Ledger  wrote:

> You might have to use hGetContents, then waitForProcess, and then
> terminateProcess -- you can then check if the process is indeed terminated
> using getProcessExitCode.


Er?  When waitForProcess returns the process is dead; there's nothing to
terminateProcess.  If you do it the other way around then you may not get
full output.

For starters, I would not build up the CreateProcess record directly but
use the "proc" record and override it with your I/O definitions.  I've been
bit by this before (I think some older version of System.Process lacked
useful predefined records?).

There is a severe gotcha here if you do things naively (like your example
code does).  If there is more output than will fit in a pipe, *no* ordering
of read / wait in a single thread will work without deadlocking; you have
no choice but to do the read in a separate thread.  This is not a Haskell
issue, it is how pipes work on POSIX systems.  (I don't know if Windows has
the same problem.)

-- 
brandon s allbery  allber...@gmail.com
wandering unix systems administrator (available) (412) 475-9364 vm/sms
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] How to waitForProcess?

2012-09-04 Thread Magicloud Magiclouds
Forgot about that, just read 'readProcess' code to figure out.
Thanks.

On Wed, Sep 5, 2012 at 12:37 PM, Ivan Lazar Miljenovic
 wrote:
> On 5 September 2012 13:45, Magicloud Magiclouds
>  wrote:
>> Hi,
>>   I have code like this and it leaves lots of zombies of flow-export.
>> Then I add waitForProcess Well I do not know where to put it.
>> Before or after 'hGetContents' both make the program hung.
>
> You're probably being bitten by hGetContents being lazy.  Force the
> result of hGetContents (e.g. `evaluate . length =<< hGetContents o ')
> and then use waitForProcess.
>
>>
>> exportCSV :: FilePath -> IO [String]
>> exportCSV file = do
>>   csv_ <- withBinaryFile file ReadMode $ \i -> do
>> (_, Just o, _, h) <- createProcess $ CreateProcess (RawCommand
>> "/usr/bin/flow-export" ["-f2"]) Nothing Nothing (UseHandle i)
>> CreatePipe Inherit True False
>> hGetContents o
>>   return $ tail $ lines csv_
>>
>> --
>> 竹密岂妨流水过
>> 山高哪阻野云飞
>>
>> And for G+, please use magiclouds#gmail.com.
>>
>> ___
>> Haskell-Cafe mailing list
>> Haskell-Cafe@haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>
>
> --
> Ivan Lazar Miljenovic
> ivan.miljeno...@gmail.com
> http://IvanMiljenovic.wordpress.com



-- 
竹密岂妨流水过
山高哪阻野云飞

And for G+, please use magiclouds#gmail.com.

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] How to waitForProcess?

2012-09-04 Thread Mike Ledger
You might have to use hGetContents, then waitForProcess, and then
terminateProcess -- you can then check if the process is indeed terminated
using getProcessExitCode.

On Wed, Sep 5, 2012 at 1:45 PM, Magicloud Magiclouds <
magicloud.magiclo...@gmail.com> wrote:

> Hi,
>   I have code like this and it leaves lots of zombies of flow-export.
> Then I add waitForProcess Well I do not know where to put it.
> Before or after 'hGetContents' both make the program hung.
>
> exportCSV :: FilePath -> IO [String]
> exportCSV file = do
>   csv_ <- withBinaryFile file ReadMode $ \i -> do
> (_, Just o, _, h) <- createProcess $ CreateProcess (RawCommand
> "/usr/bin/flow-export" ["-f2"]) Nothing Nothing (UseHandle i)
> CreatePipe Inherit True False
> hGetContents o
>   return $ tail $ lines csv_
>
> --
> 竹密岂妨流水过
> 山高哪阻野云飞
>
> And for G+, please use magiclouds#gmail.com.
>
> ___
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] How to waitForProcess?

2012-09-04 Thread Ivan Lazar Miljenovic
On 5 September 2012 13:45, Magicloud Magiclouds
 wrote:
> Hi,
>   I have code like this and it leaves lots of zombies of flow-export.
> Then I add waitForProcess Well I do not know where to put it.
> Before or after 'hGetContents' both make the program hung.

You're probably being bitten by hGetContents being lazy.  Force the
result of hGetContents (e.g. `evaluate . length =<< hGetContents o ')
and then use waitForProcess.

>
> exportCSV :: FilePath -> IO [String]
> exportCSV file = do
>   csv_ <- withBinaryFile file ReadMode $ \i -> do
> (_, Just o, _, h) <- createProcess $ CreateProcess (RawCommand
> "/usr/bin/flow-export" ["-f2"]) Nothing Nothing (UseHandle i)
> CreatePipe Inherit True False
> hGetContents o
>   return $ tail $ lines csv_
>
> --
> 竹密岂妨流水过
> 山高哪阻野云飞
>
> And for G+, please use magiclouds#gmail.com.
>
> ___
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe



-- 
Ivan Lazar Miljenovic
ivan.miljeno...@gmail.com
http://IvanMiljenovic.wordpress.com

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] How to waitForProcess?

2012-09-04 Thread Magicloud Magiclouds
Hi,
  I have code like this and it leaves lots of zombies of flow-export.
Then I add waitForProcess Well I do not know where to put it.
Before or after 'hGetContents' both make the program hung.

exportCSV :: FilePath -> IO [String]
exportCSV file = do
  csv_ <- withBinaryFile file ReadMode $ \i -> do
(_, Just o, _, h) <- createProcess $ CreateProcess (RawCommand
"/usr/bin/flow-export" ["-f2"]) Nothing Nothing (UseHandle i)
CreatePipe Inherit True False
hGetContents o
  return $ tail $ lines csv_

-- 
竹密岂妨流水过
山高哪阻野云飞

And for G+, please use magiclouds#gmail.com.

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe