[Haskell-cafe] haskell and releasing resources
Fawzi Mohamed
fmohamed at mac.com
Tue Feb 6 09:56:00 EST 2007
I am replying to myself, but anyway with it seems (from the
documentation) that
forkIO (do{ waitForProcess pid; return () })
is the best solution, and does not seem to lead to wasted resources.
Anyway I am still interested in knowing if there are better
solutions, or other places where one cannot assume that the garbage
collector will reclaim all the resources and one has to call a
special function to ensure it.
Fawzi
On Feb 6, 2007, at 2:38 PM, Fawzi Mohamed wrote:
> I am just coming to haskell, and I wrote a simple command to get
> some input from a pdf file
>
> I just wanted the output of the command so I did something like
>
> import System.Process (runInteractiveCommand)
> import IO (hGetContents)
>
> -- | returns the text of the first page of the pdf at the given
> path, needs pdftotext
> getTextOfPdf :: String -> IO String
> getTextOfPdf pdfPath = do
> (inp,out,err,pid) <- runInteractiveCommand ("pdftotext -l 1 "+
> +pdfPath++" -")
> return (hGetContents out)
>
> I don't care about error handling, if something goes wrong it is ok
> to hang or crash, but knowing unix I wondered if this would do the
> right thing or if it would create a zombi process.
>
> I was about to ask, but then I thought "let's test it", and sure
> enough the zombi stays there.
> I tried to even to allocate more than one, wait, I even managed to
> exhaust the resources of my machine...
>
> So here is what I would have liked to happen: when the pid gets
> garbage collected it tries to wait for the process, and if that
> fails the pid stays around longer and will try to wait later.
>
> Too difficult? I don't know, but it is what I had expected from
> haskell. Failing that I would have expected clear hints that one
> should wait for external processes in the documentation, and I
> found none.
>
> So what is the way out? I could do a forkIO and wait for the
> process but then I wonder do I have to wait for the thread, or dead
> thread become zombi?
> I that is the case then the only way out would be to give back also
> the pid and make the waiting responsibility of the caller, not very
> nice, but probably the real solution.
> I have seen that in missingh there is a pipeout example but it
> seems to me that you are still responsible to wait for the process
> (with ensureSuccess).
>
> Maybe the correct thing is not being able to ignore the return code
> of the process.... but now I am becoming suspicious of other
> things, for example a file handle, you need to close it or you can
> expect that it will be closed when the handle is garbage collected?
> Are there other places where you need to pay attention to be sure
> that you are releasing the resources you acquired?
> I suppose problems can come only when an external resource is
> involved, or not
>
> So
>
> 1) documentation should specify if one should do some specific
> action to free resources, can someone fix this?
>
> 2) is there a clean (haskell;) way to deal with this?
>
> 3) other places apart external processes where you have to pay
> attention?
>
> What is your wisdom...
> thanks
>
> Fawzi
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
More information about the Haskell-Cafe
mailing list