Haskell 从标准管道到工艺管道

Haskell 从标准管道到工艺管道,haskell,Haskell,我正在尝试使用以下命令将程序的stdin管道传输到外部进程 import System.IO import System.Posix.IO import System.Posix.Process import qualified System.Process as P import Control.Concurrent (forkIO, killThread) import Control.Monad main :: IO () main = do h <- fdToHandle

我正在尝试使用以下命令将程序的stdin管道传输到外部进程

import System.IO
import System.Posix.IO
import System.Posix.Process
import qualified System.Process as P
import Control.Concurrent (forkIO, killThread)
import Control.Monad

main :: IO ()
main = do
    h <- fdToHandle stdInput
    (Just hIn, _, _, p) <-
        P.createProcess (P.shell "runhaskell echo.hs"){ P.std_in = P.CreatePipe }

    hSetBuffering hIn NoBuffering
    tid <- forkIO $ getInput hIn
    e <- P.waitForProcess p
    killThread tid
    print e

getInput hin = do  
    forever $ do 
        l <- getLine
        hPutStrLn hin l
import System.IO
导入System.Posix.IO
导入System.Posix.Process
导入合格的系统。按P处理
导入控制。并发(forkIO、killThread)
进口管制
main::IO()
main=do

h您的
fdToHandler stdInput
调用将创建一个指向原始进程的文件描述符0(stdin)的新
句柄。一段时间后,垃圾收集器注意到它不再被使用,垃圾收集
句柄
,这反过来会导致底层文件描述符关闭。然后您的
getLine
(使用
System.IO.stdin
)调用失败。这是因为
Handle
仍处于打开状态,但它指向的底层文件描述符已关闭


FWIW,我建议在句柄上使用二进制I/O,以避免字符编码问题。

进程不是默认继承所有三个标准句柄吗?为什么您要自己明确管理传输?您最终是否希望更改传输中的数据或其他内容?您是否也可以包括
echo.hs
程序的内容?其功能是否与cat相同?为简单起见,是否可以这样重新编程?
pipes.hs: <stdin>: hGetLine: invalid argument (Bad file descriptor)