Java: функция popen() - как?

Это относится к локальной программе Processing. Я хотел бы запустить внешнюю программу для получения некоторых данных. Есть ли функция popen() или эквивалентная функция, которую я могу использовать?

Ответ 1

Process process = Runtime.getRuntime().exec("your command");

Затем вы можете читать и записывать данные с помощью потоков Process.

Ответ 2

JDK5 представил ProcessBuilder для большего контроля над процессом создания.

Process process = new ProcessBuilder(command).start()

Помните о том, что внутренне forkAndExec вызывается, а fork 'делает копию всего пространства адресов родителей', так что даже небольшая команда может привести к OutOfMemoryErrors, когда родительский процесс имеет большой объем памяти приобрела.

см. здесь

Ответ 3

Близкий друг popen() должен сделать именованный канал входным и/или выходным, как в UNIX:

mknod /tmp/mypipe.12345 p ; sort -o /tmp/mypipe.12345 /tmp/mypipe.12345 &

Затем откройте /tmp/mypipe.12345, напишите, закройте, откройте /tmp/mypipe.12345, прочитайте, закройте. Поскольку сортировка не может ничего записать до EOF на входе, открытие выхода произойдет после закрытия входа. Вызов popen() не может этого сделать!

Для более простых сценариев именованный канал можно просто прочитать или записать.

Конечно, вам все равно нужно его раскрутить, как при вызове system(...).

Вы хотите удалить именованный канал, когда закончите. В некоторых системах UNIX /tmp очищается при перезагрузке.

/tmp используется совместно, поэтому коллизии имен вполне возможны. Вы можете сгенерировать частично случайное имя файла канала (числовая часть /tmp/mypipe.12345) в Java, чтобы вообще предотвратить это. В некоторых системах Bash создает именованные каналы в /var/tmp для каждого использования <(...) или >(...). К сожалению, сложно определить, когда их можно удалить без эффекта (фьюзер?)!