我不太确定问题出在哪里,所以我不确定标题是否真的准确。我想打开一个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;等等,但问题可能不是我的问题认为)。如果已经提出要求,请提前道歉。任何帮助非常感谢!
答案 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进程的内容