首页 > 解决方案 > 管道两个子流程时的异常行为

问题描述

我对以下代码有不礼貌的行为

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Control.Concurrent (threadDelay)
import qualified Control.Concurrent.Async      as Async
import qualified System.Process.Typed          as Proc
import qualified System.Process                as P
import qualified GHC.IO.Handle                 as H

main :: IO ()
main = do
  print "starting"

  (readEnd, writeEnd) <- P.createPipe

  let p1 = Proc.setStdout (Proc.useHandleClose writeEnd) "echo -n 'foo'"
  let p2 = Proc.setStdin (Proc.useHandleClose readEnd) "base64 -"

  Async.concurrently
    (threadDelay 1000 *> Proc.runProcess_ p2) -- with the delay, it works
    -- (Proc.runProcess_ p2) -- that line will make the program hang forever
    (Proc.runProcess_ p1)

  print "done"

我想将标准输出从第一个子进程传送到第二个子进程。我尝试使用getStdoutsetStdin但遇到了类型检查器的问题:

Proc.withProcess_ "echo -n foo" $ \r1 -> do
  let p2 = Proc.setStdin (Proc.getStdout r1) "base64"


  • Couldn't match expected type ‘Proc.StreamSpec
                                    'Proc.STInput stdin0’
                with actual type ‘()’
  • In the first argument of ‘Proc.setStdin’, namely
      ‘(Proc.getStdout r1)’
    In the expression: Proc.setStdin (Proc.getStdout r1) "base64"

标签: haskellprocess

解决方案


推荐阅读