【发布时间】:2016-03-21 19:38:15
【问题描述】:
这是一个使用Unix 模块与子进程交互的简单程序。我只是启动一个cat shell 命令,给它发送一个字符串并读回它:
#load "unix.cma";; (* Needed if you are in the toplevel *)
let () =
let sin, sout, serr = Unix.open_process_full "cat" [||] in
output_string sout "test\n";
flush sout;
input_line sin |> print_string;
flush stdout;
Unix.close_process_full (sin, sout, serr) |> ignore;;
最近我开始研究Lwt 库,我想用它重现相同的功能。我认为以下应该具有完全相同的结果:
#use "topfind";; (* *)
#thread;; (* Also only for the toplevel *)
#require "lwt.simple-top";; (* *)
let () =
let open Lwt in
let process = Lwt_process.open_process_full ( "cat" , [||] ) in
Lwt_io.write_line process#stdin "test\n"
>>= ( fun () -> Lwt_io.flush process#stdin )
>>= ( fun () -> Lwt_io.read process#stdout )
>>= ( fun str -> Lwt_io.print str )
>>= ( fun () -> Lwt_io.flush Lwt_io.stdout )
|> Lwt_main.run
但它并没有像我期望的那样工作——显然它读取然后打印一个空字符串。
我想我对Lwt 应该如何工作有一些基本的困惑,但我无法弄清楚。有人可以告诉我如何使用Lwt 与子进程通信吗?
【问题讨论】:
-
你传错了:需要类似:
Lwt_process.open_process_full ("cat", [|"cat"; "Makefile"|]) -
@EdgarAroutiounian 他正在运行
cat,没有参数,因此它将标准输入复制到标准输出(cat。) -
@EdgarAroutiounian 是的
[|"cat"; "Makefile"|]工作并转储 Makefile。但这不是我想要的——正如@RichN 所说,我想使用cat作为标准输入-> 标准输出程序。我也试过[|"cat"|]——因为一些奇怪的原因阻止了程序......
标签: subprocess ocaml ocaml-lwt