Just to be clear: does this need to work on Windows, or only on Unix-like systems? If it only needs to work under Unix, then your problem sounds to me like a standard inter-process communication problem with the usual solutions being to use a combination of pipe(), dup2(), and select() system calls, and with the alternative solution being to use a pseudo-terminal. Chapter 5 of "Unix System Programming in OCaml" https://ocaml.github.io/ocamlunix/pipes.html should give you some guidance on implementing the former solution. If you want to use pseudo-terminals, I don't know of a freely-available tutorial-style reference off the top of my head. "Advanced Programming in the Unix Environment" by late Richard Stevens has had a chapter dedicated to pseudo-terminals since the first edition of the book: perhaps your local library has a copy. Failing that, you could read Linux man page for pty(7), and follow the links to forkpty and friends. For example, you could start here: http://man7.org/linux/man-pages/man7/pty.7.html. The fact that you want to do all of this from Matlab is an extra challenge, but I don't think it's an insurmountable challenge. Even if Matlab doesn't have the functions you need "out of the box", it is possible to extend Matlab with C code, so you could implement a C function to initialize the external process, and another function to send to the external process and receive results. The following is probably a good starting point for learning how to extend Matlab with C/C++: https://www.mathworks.com/help/matlab/call-mex-files-1.html. I don't know off the top of my head if Matlab already comes with sufficiently flexible functionality for communicating with an external process: you could try searching the documentation and/or engaging Mathworks technical support (assuming your license comes with technical support) and/or asking on Mathworks forums. -- Best of luck Zhenya On Thu, Mar 23, 2017 at 5:37 AM, wrote: > Hello, > > I need to find a way to put Ocaml program in memory so I could interact > with the program > (call function, get result, find information about the variables, ...) > without always reading the file. > > That what append when we use the directive #use "file.ml";; in the > interactive shell (the toplevel, when you type the command ocaml in a > shell). > > The instruction need to come from a Matlab function. So, I was thinking to > create a process who run the ocaml command, > redirect his standard input in a named pipe, redirect his standard output > in another named pipe, so I could send instructions and received responses. > > But when I send the first instruction (ex : #use "file.ml";;\n), the > ocaml process send back the response and stop. > > ____ > > file.ml : > let x = 10;; > > ____ > > "#use "file.ml";;\n" > Matlab -- /tmp/pipe_in --> ocaml > > "val x : int = 10" > Matlab <-- /tmp/pipe_out -- ocaml > then ocaml stop... > > ___ > > > So I would like to know if you think it's a good solution and if it is, do > someone know how could I make it work ? > > _ > > I've tried another solution. I use Unix.fork() and launch, in the son > process, the ocaml command then > I send instructions from the father process to the son process with anonym > pipe (Unix.pipe()). > > But here I have trouble with blocking read, I send an instruction, read > the answer but even if I've read all char of the answer, it's wait to read > more but there is no more to read... > > I have tried to use Unix.set_nonblock() and catch EAGAIN, but then I don't > get anything at all in the buffer given to Unix.read(). > > If someone could help, I would be grateful ! > Lachat Paul > >