从createProcess外部获得的句柄中读取

时间:2017-11-01 11:28:54

标签: haskell io ipc

我尝试创建一个进程,并通过我在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来传达两个流程?

1 个答案:

答案 0 :(得分:2)

createProcess的此行为是documented

  

请注意,Handles通过提供std_in,std_out或std_err   将通过调用此函数来关闭UseHandle构造函数。

文档建议改为使用createProcess_函数。