Haskell Can';t通过stdin传递数据以处理使用额外导管生成的数据
在我的程序中,我启动外部进程并通过Haskell Can';t通过stdin传递数据以处理使用额外导管生成的数据,haskell,haskell-stack,stm,conduit,Haskell,Haskell Stack,Stm,Conduit,在我的程序中,我启动外部进程并通过stdin和stdout与之通信。我通过导管(生产者)从STMsTQueue开始输入。在我决定改变这个版本之前,它一直很有魅力。它在lts中工作得很好,所以问题是sinkHandle的默认行为是在每个数据块之后都不刷新 我已经解决了这个问题,首先移植到Data.conduct.Process.Typed,然后滚动我自己的createSink变体,该变体使用而不是sinkHandle #!/usr/bin/env stack -- stack --resolver
stdin
和stdout
与之通信。我通过导管(生产者)从STM
sTQueue
开始输入。在我决定改变这个版本之前,它一直很有魅力。它在lts中工作得很好,所以问题是sinkHandle
的默认行为是在每个数据块之后都不刷新
我已经解决了这个问题,首先移植到Data.conduct.Process.Typed
,然后滚动我自己的createSink
变体,该变体使用而不是sinkHandle
#!/usr/bin/env stack
-- stack --resolver lts-10.4 --install-ghc runghc --package conduit-extra --package stm-conduit
{-# LANGUAGE OverloadedStrings #-}
import Control.Concurrent
import Control.Monad.STM
import Control.Concurrent.STM.TQueue
import Data.Conduit
import qualified Data.Conduit.Binary as CB
import qualified Data.Conduit.List as CL
import Data.Conduit.Process (CreateProcess (..),
proc, sourceProcessWithStreams)
import qualified Data.Conduit.TQueue as CTQ
import qualified Data.ByteString.Char8 as BS
import Data.Monoid ((<>))
main :: IO ()
main = do
putStrLn "Enter \"exit\" to exit."
q <- open
putStrLn "connection opened"
loop q
where loop q = do
s <- BS.getLine
case s of
"exit" -> return ()
req -> do
atomically $ writeTQueue q req
loop q
open :: IO (TQueue BS.ByteString)
open = do
req <- atomically newTQueue
let chat :: CreateProcess
chat = proc "cat" []
input :: Producer IO BS.ByteString
input = toProducer
$ CTQ.sourceTQueue req
-- .| CL.mapM_ (\bs -> BS.putStrLn (("queue: " :: BS.ByteString) <> bs))
output :: Consumer BS.ByteString IO ()
output = toConsumer
$ CL.mapM_ BS.putStrLn
_ <- forkIO (sourceProcessWithStreams chat input output output >> pure ())
pure req
echo "test" > /proc/<pid of spawned cat>/fd/0