我尝试创建一个进程,并通过我在createProcess
函数之外提供的句柄与之进行通信:
stdOutH <- openFile (logDir </> "stdout.log") ReadWriteMode
hSetBuffering stdOutH LineBuffering
(_, _, _, ph) <- createProcess $
(proc "someproc" []) { std_out = UseHandle stdOutH
, std_err = UseHandle stdErrH
}
line <- hGetLine stdOutH
putStrLn $ "Got " ++ line
"someproc"
进程向标准输出吐出一行,我想从生成它的进程中读取它。但是,如果我尝试这样做,我会收到以下错误:
hGetLine:非法操作(句柄已关闭)
我不明白为什么在创建的进程运行时关闭句柄的原因。如果我使用CreatePipe
而不是UseHandle
,这是有效的,问题是我只想阅读第一行。但这样做需要继续从管道读取,否则在"someproc"
输出一定量后它会变满。
那么,有没有办法使用system.process
以上述方式通过stdOutH
来传达两个流程?
答案 0 :(得分:2)
createProcess
的此行为是documented:
请注意,Handles通过提供std_in,std_out或std_err 将通过调用此函数来关闭UseHandle构造函数。
文档建议改为使用createProcess_
函数。