Вот простая программа, которая использует модуль Unix
для взаимодействия с подпроцессом. Я просто запустить команду cat
оболочки, отправить его строку и прочитать ее обратно:Простое взаимодействие 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' без аргументов, поэтому он будет Скопируйте stdin в stdout (из 'cat'.) – RichN
@EdgarAroutiounian Yeah' [| "cat"; «Makefile» |] 'работает и выгружает Makefile. Но это не то, что я хочу - как сказал @RichN, я хотел бы использовать программу 'cat' как stdin -> stdout. Я также попробовал '[|" cat "|]' - который блокирует программу по какой-то странной причине ... – Kostya