2016-03-21 6 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?

+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 сделать соответствующую команду, в вашем случае, правильная команда является следующее:

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

Кроме того, я подозреваю, что после того, как вы будете запускать программу должным образом, вы будете интересно, почему ваша программа блокируется. Причина в том, что процесс cat не завершится, пока вы не напишете EOF на его входной канал. Вот почему звонок Lwt_io.read никогда не закончится. Решением было бы закрыть канал stdin.