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

最佳答案

createProcess的这种行为是documented


请注意,通过以下方式为std_in,std_out或std_err提供了句柄
调用此函数将关闭UseHandle构造函数。


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

10-01 11:01