如何将进程的stdout和stderr传递给同一个Handle?

时间:2012-10-29 01:40:35

标签: windows haskell

如何将进程的stdout和stderr传递给同一个Handle?在unix系统上,它非常简单,只需使用createPipe并将写入端作为stdout和stderr传递给runProcess。在Windows上,它更难:

  • unix-compat和Win32包都没有导出创建管道的方法。

  • openTempFile(可用于模拟管道)在创建的Handle上设置了错误的模式。

编辑:提供更多上下文:我想运行一个进程,让它以跨平台的方式将stdout和stderr写入同一个Handle

2 个答案:

答案 0 :(得分:2)

您可以使用System.Process中的内容。在CreateProcess定义中有

std_in       :: StdStream,               -- ^ How to determine stdin
std_out      :: StdStream,               -- ^ How to determine stdout
std_err      :: StdStream,               -- ^ How to determine stderr

StdStream有这个构造函数:

data StdStream = UseHandle Handle

之后,将您形成的对象传递给createProcess函数以运行proc。

答案 1 :(得分:0)

我最终实施了跨平台createPipehttps://github.com/haskell/cabal/blob/master/Cabal/tests/Distribution/Compat/CreatePipe.hsc

我们应该把它放在某个地方更容易接近的地方。