【问题标题】:Reading from a handle obtained outside createProcess从 createProcess 外部获取的句柄读取
【发布时间】:2017-11-01 11:28:54
【问题描述】:

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

【问题讨论】:

  • 清除不打算再次使用的管道,可以使用forkIO (forever (hGetChar pipeHandle))
  • 这或多或少是我最终做的......

标签: haskell io ipc


【解决方案1】:

createProcess 的这种行为是documented

请注意,为 std_in、std_out 或 std_err 提供的句柄是通过 UseHandle 构造函数将通过调用该函数来关闭。

文档建议改用createProcess_ 函数。

【讨论】:

  • 我应该读得更好:/无论如何,我认为我不能使用文件句柄,因为我需要等待生成进程的输出的“阻塞读取”,这需要一个管道(而不是文件)...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
相关资源
最近更新 更多