Here is a simple program that uses the Unix module to interact with a subprocess. I just launch a cat shell command, send it a string and read it back:
#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;;
Recently I started studying the Lwt library, and I wanted to reproduce the same functionality with it. I though that the following should have exactly the same result:
    #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
But it doesn't work as I expect it to -- apparently it reads and then prints an empty string.
I guess I have some fundamental confusion on how Lwt should work, but I cannot figure it out. Can someone show me how one can communicate with a subprocess using Lwt?