首页 > 解决方案 > 从使用 clojure 应用程序调用的 clojure 应用程序中获取 *in*

问题描述

因此,在一个 clojure 项目(使用 lein run 启动)中,我调用:

(ProcessBuilder. (into-array ["bash" "-c" "cd some-folder ; lein run"])

在某个文件夹的项目中,有一个带有 (read/line) 的循环,它等待来自父级的输入。

但是,将输入发送到:

^InputStream (.getOutputStream child-process) ; doesn't work.

没有到达 clojure 代码,这是由于 lein 反过来启动了一个进程。如何获取子进程中的 clojure 代码正在侦听的流?

标签: clojureinputstreamleiningen

解决方案


我的第一个虽然是“为什么?”。但是,如果必须的话,也许Unix 命名管道会是一个很好的答案。这将创建一个 FIFO 缓冲区,读取器和写入器都将其视为普通文件:


在 Unix 中

命名管道使用文件系统,而不是传统的、未命名的 shell 管道。它是使用mkfifo()or显式创建mknod()的,两个独立的进程可以通过名称访问管道——一个进程可以作为读取器打开它,另一个作为写入器打开。

例如,可以创建一个管道并设置 gzip 来压缩通过管道传输的内容:

 mkfifo my_pipe
 gzip -9 -c < my_pipe > out.gz &

在一个单独的进程外壳中,可以独立地发送要压缩的数据:

cat file > my_pipe

命名管道可以像任何文件一样被删除:

rm my_pipe

另一个答案是作者使用命名文件(可能在 中/tmp)为子进程写入输入数据。或者,您可以让父进程和子进程通过套接字进行通信,也许来回发送序列化的 EDN 数据。


推荐阅读