Haskell从流程

时间:2015-10-13 08:12:40

标签: shell haskell process io

我不太确定问题出在哪里,所以我不确定标题是否真的准确。我想打开一个shell进程,然后写入它然后读取输出:

import System.IO (hPutStr, hGetContents, hSetBuffering, hClose,
            BufferMode(NoBuffering))
import System.Process (runInteractiveProcess)

main = do
        (hIn, hOut, _, _) <- runInteractiveProcess
                                "/bin/sh" [] Nothing Nothing
        hSetBuffering hIn NoBuffering
        hPutStr hIn "ls /\n"
        hGetContents hOut >>= putStrLn
        hClose hIn
        hClose hOut

这似乎有用(有点):

$ ./mwe
bin
boot
cdrom
dev
etc
...

问题是,程序挂起(我需要用Ctrl-C杀掉它)。我想shell仍然在运行,这阻止了Haskell prohram的退出。所以我尝试使用terminateProcess显式终止shell:

main = do
        (hIn, hOut, _, sh) <- runInteractiveProcess
                                "/bin/sh" [] Nothing Nothing
        hSetBuffering hIn NoBuffering
        hPutStr hIn "ls /\n"
        hGetContents hOut >>= putStrLn
        terminateProcess sh
        hClose hIn
        hClose hOut

但无济于事。我还尝试将exit发送到shell:

    ...
    hGetContents hOut >>= putStrLn
    hPutStr hIn "exit\n"
    ...

也不起作用。

我确定解决方案很简单,但我无法找到它(尝试搜索&#34; haskell杀死进程&#34;等等,但问题可能不是我的问题认为)。如果已经提出要求,请提前道歉。任何帮助非常感谢!

1 个答案:

答案 0 :(得分:3)

我有一些haskell代码从shell进程读取内容,但它没有挂起....给它一个镜头:

import System.Process
import GHC.IO.Handle.Text

main :: IO ()
main = do
   (_,Just ho1, _, hp1) <- createProcess (shell "find -iname \"*.lhs\""){std_out=CreatePipe}
   sOut <- hGetContents ho1
   _ <- waitForProcess hp1

然后,sOut将拥有shell进程的内容