5
votes

So, I got past actually getting a program to run from SBCL Lisp using inferior-shell (presumably UIOP would be just fine). Anyway, now that I can do that, I still have no clue how to interact with the program if it is running in the background.

All of this functionality like pipes and streams connected to the stdin and stdout of the running program are advertised, just not documented. It would seem like this is the most basic thing to do.

Does anybody have an example of doing such a thing?

Any help is appreciated.

-Todd

1
This is probably a too broad question for SO. Do you have a simple example to show? In which something does not behave as you expected? - Renzo
@Renzo the way I understand it: SBCL has sb-ext:run-program that lets you start the process asynchronously and connect input and output streams to it. Then, you can communicate with it using the streams during the life of the program (e.g., start gnuplot and keep it running and plotting using the same process instead of restarting it all the time). In portable way, I've only seen synchronous: start the process and pass start arguments - wait until it finishes. - mobiuseng
The EAZY-PROCESS library make it easy to create pipes and asynchronous processes, but deliberately does not provide support for streams. Everything is based on files and file descriptors. You can use temporary files, though. - coredump

1 Answers

1
votes

Have you looked at the SBCL manual? The options for RUN-PROGRAM are documented there: http://www.sbcl.org/manual/#Running-external-programs

I think you just need to create streams and pass them to RUN-PROGRAM via the :input, :output, and :error arguments.

Here is an example where I give RUN-PROGRAM stream arguments to execute gnuplot (although I'm not leaving the input stream open as you want). https://github.com/belambert/cl-gnuplot/blob/master/src/gnuplot.lisp#L18