1
這是一個使用Unix
模塊與子流程交互的簡單程序。我剛剛推出cat
shell命令,它發送一個字符串,並讀回:LWT與子流程的簡單交互
#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',所以它會複製標準輸入到標準輸出('貓') – RichN
@EdgarAroutiounian Yeah'[|「cat」; 「Makefile」|]'工作並轉儲Makefile。但那不是我想要的 - 正如@RichN所說,我想用'cat'作爲stdin - > stdout程序。我也嘗試過'[|「cat」|]' - 由於一些奇怪的原因阻止了程序... – Kostya