3

Unixモジュールを使用してサブプロセスと対話する簡単なプログラムを次に示します。シェル コマンドを起動catし、文字列を送信して読み返すだけです。

#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?

4

1 に答える 1

2

適切なコマンドを作成するために使用Lwt_process.shellします。あなたの場合、適切なコマンドは次のとおりです。

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

また、プログラムを適切な方法で実行した後、なぜプログラムがブロックされているのか不思議に思うでしょう。catこれは、入力チャネルに EOF を書き込むまでプロセスが終了しないためです。そのため、Lwt_io.read通話は終了しません。stdin解決策は、チャネルを閉じることです。

于 2016-03-21T21:00:13.973 に答える