Получение * in * из приложений clojure, вызываемых приложениями clojure - PullRequest
0 голосов
/ 30 апреля 2018

Итак, в проекте 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 в дочернем процессе?

1 Ответ

0 голосов
/ 30 апреля 2018

Мое первое, хотя "Почему?" Но, если вам нужно, возможно, именованный канал Unix будет хорошим ответом. Это создает буфер FIFO, который читатель и писатель воспринимают как обычный файл:


В Unix

Вместо обычного неназванного конвейера оболочки именованный конвейер использует файловую систему. Он явно создается с использованием mkfifo() или mknod(), и два отдельных процесса могут обращаться к каналу по имени - один процесс может открыть его как читатель, а другой как писатель.

Например, можно создать канал и настроить gzip для сжатия передаваемых в него вещей:

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

В отдельной оболочке процесса, независимо, можно отправить данные для сжатия:

cat file > my_pipe

Именованный канал можно удалить, как и любой файл:

rm my_pipe

Другим ответом для автора будет использование именованного файла (возможно, /tmp) для записи входных данных для дочернего процесса. Или вы могли бы связать родительский и дочерний процессы через сокет, возможно, отправив сериализованные данные EDN туда и обратно.

...