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 ( )