2016-03-21 11 views
1

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.shell "cat";; 
- : Lwt_process.command = ("", [|"/bin/sh"; "-c"; "cat"|]) 

+0

あなたはそれを間違って渡しています: 'Lwt_process.open_process_full(" cat "、[" cat ";" Makefile "|))' –

+0

@EdgarAroutiounian彼は引数なしで 'cat'を実行しています。 stdinをstdout( 'cat'の)にコピーします。 – RichN

+0

@EdgarAroutiounian Yeah' [| "cat"; "Makefile" |] 'は動作し、Makefileをダンプします。しかし、これは私の望むものではありません。@ RichNは言っていますが、 'cat'をstdin - > stdoutプログラムとして使いたいと思います。私は '[|" cat "|]'を試みました - それはいくつかの奇抜な理由でプログラムをブロックしています... – Kostya

答えて

0

使用Lwt_process.shellは、あなたの場合には、適切なコマンドを作るために、適切なコマンドは以下のとおりです。なぜあなたのプログラムがブロックされているのだろうか。この理由は、catプロセスは、入力チャネルにEOFを書き込むまで終了しないためです。そのため、Lwt_io.readコールが終了しないのはこのためです。解決方法はstdinチャンネルを閉じることです。

関連する問題