【问题标题】:Getting the *in* from clojure apps called with clojure apps从使用 clojure 应用程序调用的 clojure 应用程序中获取 *in*
【发布时间】:2018-04-29 21:24:39
【问题描述】:

所以在一个 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代码正在监听的流?

【问题讨论】:

    标签: clojure inputstream leiningen


    【解决方案1】:

    我的第一个想法是“为什么?”。但是,如果必须的话,Unix named pipe 可能是一个很好的答案。这会创建一个 FIFO 缓冲区,读写器都将其视为普通文件:


    在 Unix 中

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

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

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

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

    cat file > my_pipe
    

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

    rm my_pipe
    

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

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      相关资源
      最近更新 更多