Burada, bir alt işlemle etkileşime girmek için Unix
modülünü kullanan basit bir programdır. Sadece bir cat
kabuk komutu başlatmak it a dize göndermek ve geri okuyun: LWT bir alt işlemle basit etkileşim
#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;;
Son zamanlarda
Lwt
kütüphane okumaya başladı, ve onunla aynı işlevselliği çoğaltmak istedik. Gerçi şu tam olarak aynı sonucu olması gerektiğini:
#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
Ama bunu beklediğiniz gibi çalışmıyor - görünüşe okur ve daha sonra boş bir dize yazdırır.
Lwt
'un nasıl çalışması gerektiğine dair bazı temel karışıklık var, ama bunu çözemiyorum. Birisi bana Lwt
kullanarak bir alt işlemin nasıl iletişim kurabildiğini gösterebilir mi? Sana doğru bir şekilde programı çalıştırın sonra, sen olacağını, şüpheli Ayrıca
Lwt_process.shell "cat";;
- : Lwt_process.command = ("", [|"/bin/sh"; "-c"; "cat"|])
:
Hatalı bir şekilde iletiyorsunuz: Şunlar gibi bir şeye ihtiyacınız var: 'Lwt_process.open_process_full (" cat ", [|" cat ";" Makefile "|])' –
@EdgarAroutiounian, "cat" ı hiçbir argüman olmadan çalıştırıyor. stdin'i stdout'a (kedinin) kopyala – RichN
@EdgarAroutiounian Yeah '[|" cat "; "Makefile" |] 'Makefile'yi işler ve yıkar. Ama istediğim bu değil - @RichN'in dediği gibi, stdin -> stdout programı olarak 'cat' kullanmak istiyorum. Ayrıca programın bazı garip nedenlerle engellenmesini de denedim [| "cat" |] '- – Kostya