2016-03-21 16 views
1

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"|]) 

:

+0

Hatalı bir şekilde iletiyorsunuz: Şunlar gibi bir şeye ihtiyacınız var: 'Lwt_process.open_process_full (" cat ", [|" cat ";" Makefile "|])' –

+0

@EdgarAroutiounian, "cat" ı hiçbir argüman olmadan çalıştırıyor. stdin'i stdout'a (kedinin) kopyala – RichN

+0

@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

cevap

0

kullanın Lwt_process.shell senin durumunda, uygun bir komut vermek için, uygun komut şudur merak etmek, programınızı neden engelliyorsunuz? Bunun nedeni, giriş kanalına bir EOF yazana kadar cat işleminin bitmemesidir. Bu yüzden Lwt_io.read numaralı çağrı hiç bitmeyecek. Çözüm, stdin kanalını kapatmak olacaktır.

İlgili konular