我想要创建一个进程,并定期将来自Haskell程序的一些文本写入该进程的stdin(从IO操作中)。以下在GHCi中正确工作,但在构建和运行时不起作用。在GHCi中,一切都完美地工作,并且IO操作的值会定期输入。但是,在构建和运行时,似乎会在写入进程的stdin时暂停任意长的时间。我已经使用了CreateProcess(来自System.Process)来创建该句柄,并尝试过hPutStrLn(缓冲区设置为NoBuffering--LineBuffering也没用)。所以我尝试使用process-streaming包和pipes,但似乎根本无法让它们工作。真正的问题是:如何从Haskell创建进程并定期向其写入?下面是一个最小化的示例,展示了这种行为:
import System.Process
import Data.IORef
import qualified Data.Text as T -- from the text package
import qualified Data.Text.IO as TIO
import Control.Concurrent.Timer -- from the timers package
import Control.Concurrent.Suspend -- from the suspend package
main = do
(Just hin, _,_,_) <- createProcess_ "bgProcess" $
(System.Process.proc "grep" ["10"]) { std_in = CreatePipe }
ref <- newIORef 0 :: IO (IORef Int)
flip repeatedTimer (msDelay 1000) $ do
x <- atomicModifyIORef' ref $ \x -> (x + 1, x)
hSetBuffering hin NoBuffering
TIO.hPutStrLn hin $ T.pack $ show x
非常感谢您的帮助。