2016-03-21 104 views
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與子流程進行通信嗎?

+0

你正在傳遞錯誤信息:需要類似於:'Lwt_process.open_process_full(「cat」,[|「cat」;「Makefile」|])' –

+0

@EdgarAroutiounian他沒有參數運行'cat',所以它會複製標準輸入到標準輸出('貓') – RichN

+0

@EdgarAroutiounian Yeah'[|「cat」; 「Makefile」|]'工作並轉儲Makefile。但那不是我想要的 - 正如@RichN所說,我想用'cat'作爲stdin - > stdout程序。我也嘗試過'[|「cat」|]' - 由於一些奇怪的原因阻止了程序... – Kostya

回答

0

使用Lwt_process.shell做出正確的命令,你的情況,正確的命令是:

Lwt_process.shell "cat";; 
- : Lwt_process.command = ("", [|"/bin/sh"; "-c"; "cat"|]) 

而且,我懷疑,你會以適當的方式運行程序後,你會想知道,爲什麼你的程序被阻止。這是因爲cat過程在您寫入EOF到它的輸入通道之前不會完成。這就是爲什麼Lwt_io.read電話不會完成。解決方案是關閉stdin頻道。