Haskell - 使用从 createProcess 和 CreatePipe 创建的句柄通过管道传输到 StdStream
Haskell - Using the handle created from createProcess and CreatePipe to pipe into StdStream
我目前有这个代码:
main :: IO ()
main = do
(_, Just so, _, _) <- createProcess (proc "ls" ["."]) { std_out = CreatePipe }
_ <- createProcess (proc "sort" []) { std_in = so }
print "foo"
我得到的错误是:
Couldn't match expected type ‘StdStream’
with actual type ‘GHC.IO.Handle.Types.Handle’
In the ‘std_in’ field of a record
In the first argument of ‘createProcess’, namely
‘(proc "sort" []) {std_in = so}’
In a stmt of a 'do' block:
_ <- createProcess ((proc "sort" []) {std_in = so})
我正在尝试将 ls 进程的输出通过管道传输到排序进程,但是 CreatePipe returns 一个句柄对并且 std_in 需要一个 StdStream。
我该如何将句柄转换为标准流。
谢谢!
StdStream
有一个将执行转换的 UseHandle
构造函数,因此请调整您的代码以读取:
_ <- createProcess (proc "sort" []) { std_in = UseHandle so }
它会 运行,打印一个排序的目录列表。
但是,如果您希望在进程完成后打印 "foo",则需要先等待这两个进程。 (无论如何你都想这样做,否则你将有一堆 "zombie" 进程挂起直到 Haskell 终止。)调整你的代码阅读:
main = do
(_, Just so, _, ph1) <- createProcess (proc "ls" ["."])
{ std_out = CreatePipe }
(_, _, _, ph2) <- createProcess (proc "sort" []) { std_in = UseHandle so }
waitForProcess ph1
waitForProcess ph2
print "foo"
你应该可以开始了
我目前有这个代码:
main :: IO ()
main = do
(_, Just so, _, _) <- createProcess (proc "ls" ["."]) { std_out = CreatePipe }
_ <- createProcess (proc "sort" []) { std_in = so }
print "foo"
我得到的错误是:
Couldn't match expected type ‘StdStream’
with actual type ‘GHC.IO.Handle.Types.Handle’
In the ‘std_in’ field of a record
In the first argument of ‘createProcess’, namely
‘(proc "sort" []) {std_in = so}’
In a stmt of a 'do' block:
_ <- createProcess ((proc "sort" []) {std_in = so})
我正在尝试将 ls 进程的输出通过管道传输到排序进程,但是 CreatePipe returns 一个句柄对并且 std_in 需要一个 StdStream。
我该如何将句柄转换为标准流。
谢谢!
StdStream
有一个将执行转换的 UseHandle
构造函数,因此请调整您的代码以读取:
_ <- createProcess (proc "sort" []) { std_in = UseHandle so }
它会 运行,打印一个排序的目录列表。
但是,如果您希望在进程完成后打印 "foo",则需要先等待这两个进程。 (无论如何你都想这样做,否则你将有一堆 "zombie" 进程挂起直到 Haskell 终止。)调整你的代码阅读:
main = do
(_, Just so, _, ph1) <- createProcess (proc "ls" ["."])
{ std_out = CreatePipe }
(_, _, _, ph2) <- createProcess (proc "sort" []) { std_in = UseHandle so }
waitForProcess ph1
waitForProcess ph2
print "foo"
你应该可以开始了