与stdin,stdout同时运行进程

时间:2017-07-18 16:48:33

标签: haskell stdout stdin

如何展开“Running processes concurrently”以包含stdin和stdout?

例如,假设我的(Windows)命令在stdout上输出10,我想检查所有进程的输出是否正确:

let cmds = replicate 100 "echo 10"

我应该如何编写Haskell程序?

1 个答案:

答案 0 :(得分:1)

import Control.Concurrent.Async
import System.IO
import System.Process

您关联的网站上的代码使用runCommand;允许您访问流的等效项是runInteractiveCommand。然后,您可以使用hGetContents从流中读取。

-- | Run @echo 10@ and tests whether the output is what we expect.
testOne :: IO Bool
testOne =
  runInteractiveCommand "echo 10" >>= \(_stdin, stdout, _stderr, _proc) ->
  hGetContents stdout >>= \out ->
  return (out == "10\n")

然后我们可以使用async包中的replicateConcurrently同时运行100次,并在结果上fmap (all id)获取所有的布尔结果。

-- | Run 'testOne' 100 times concurrently, return whether all tests succeeded.
testMany :: IO Bool
testMany =
  all id <$> replicateConcurrently 100 testOne