Unix
モジュールを使用してサブプロセスと対話する簡単なプログラムを次に示します。シェル コマンドを起動cat
し、文字列を送信して読み返すだけです。
#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
?