Haskell 从标准管道到工艺管道
我正在尝试使用以下命令将程序的stdin管道传输到外部进程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
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)