【问题标题】:LWT simple interaction with a subprocessLWT 与子流程的简单交互
【发布时间】:2016-03-21 19:38:15
【问题描述】:

这是一个使用Unix 模块与子进程交互的简单程序。我只是启动一个cat shell 命令,给它发送一个字符串并读回它:

#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.open_process_full ("cat", [|"cat"; "Makefile"|])
  • @EdgarAroutiounian 他正在运行cat,没有参数,因此它将标准输入复制到标准输出(cat。)
  • @EdgarAroutiounian 是的 [|"cat"; "Makefile"|] 工作并转储 Makefile。但这不是我想要的——正如@RichN 所说,我想使用cat 作为标准输入-> 标准输出程序。我也试过[|"cat"|]——因为一些奇怪的原因阻止了程序......

标签: subprocess ocaml ocaml-lwt


【解决方案1】:

使用Lwt_process.shell 发出正确的命令,在您的情况下,正确的命令如下:

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

另外,我怀疑,在您以正确的方式运行程序之后,您会想知道为什么您的程序会阻塞。这是因为cat 进程在您将 EOF 写入其输入通道之前不会完成。这就是为什么Lwt_io.read 电话永远不会结束的原因。一个解决方案是关闭stdin 频道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多