Haskell 如何生成标准输出?

Haskell 如何生成标准输出?,haskell,terminal,process,stream,handle,Haskell,Terminal,Process,Stream,Handle,我有一个程序,我想运行并等待它在继续之前初始化,但我也希望程序像往常一样写入终端,如果我只是用callProcess调用它,它就会这样做。 为此,我设计了以下方法: (在这种情况下,我听标准错误,但我认为这是不必要的。) … 使用CreateProcess applicationProcessDescription\\可能是应用程序TDERR->do 案例可能适用于 Nothing->throwIO$DeploymentException$“无法获取应用程序的标准错误流!” 只需applicat

我有一个程序,我想运行并等待它在继续之前初始化,但我也希望程序像往常一样写入终端,如果我只是用
callProcess
调用它,它就会这样做。 为此,我设计了以下方法:

(在这种情况下,我听标准错误,但我认为这是不必要的。)

…
使用CreateProcess applicationProcessDescription\\可能是应用程序TDERR->do
案例可能适用于
Nothing->throwIO$DeploymentException$“无法获取应用程序的标准错误流!”
只需applicationStdErr->do
可能会超时IO()
waitForApplication stdErr=do
行句柄->IO()
redirectHandle from to=void$forkFinally
永远做
行返回()
我截取子进程所说的任何内容,逐行,以某种方式分析这些行,并将它们放入主进程的标准错误中。 当我做完后,我仍然要继续倾听和传达。 这似乎是一种荒谬的做法

我想做的是以某种方式分叉子流程的标准错误流,以便在需要时被动地窃听它,然后简单地断开连接。 对我来说很重要的一点是,无论子流程说什么,都要尽可能忠实地传递给人类——没有延迟和遗漏


有什么好方法可以做到这一点吗?

我个人根本想不出在Unix中实现这一点的方法。如果您真的想进入杂草丛中,请看看如何使用
ptrace
。这听起来相当糟糕,但我怀疑可能有这样的解决方案,或者至少是部分解决方案。
  …
  withCreateProcess applicationProcessDescription \ _ _ maybeApplicationStdErr _ -> do
    case maybeApplicationStdErr of
      Nothing -> throwIO $ DeploymentException $ "Unable to grab application's standard error stream!"
      Just applicationStdErr -> do
        maybeTimeout <- timeout waitingTime (waitForApplication applicationStdErr)
        when (isNothing maybeTimeout) $ throwIO $ DeploymentException $ "Application took too long initializing!"
        redirectHandle applicationStdErr stderr
        …

waitForApplication :: Handle -> IO ( )
waitForApplication stdErr = do
  line <- hGetLine stdErr
  hPutStrLn stderr line
  if line == "Application initialized."
    then return ( )
    else waitForApplication stdErr

redirectHandle :: Handle -> Handle -> IO ( )
redirectHandle from to = void $ forkFinally
  do forever do
      line <- hGetLine from
      hPutStrLn to line
  \ _ -> return ( )