(Блокировка) интерактивная оболочка через ProcessBuilder - PullRequest
0 голосов
/ 17 июня 2019

Я построил интерактивный EXE, что означает, что вы можете непрерывно отправлять ему новые команды, и он будет их обрабатывать.

Автоматизация этого может быть реализована в Java в соответствии с this ответ.Однако при отправке команды код не будет ждать, пока команда не завершится.Вместо этого он сразу вернет элемент управления вызывающей стороне, что может привести к race conditions: если отправленная команда должна была записать файл, возможно, файл еще не создан до того, как к нему будет произведен доступ.Как можно отправить команду, прочитать выходные данные и, как только снова ожидается некоторая входная команда, вызов sendCommand() возвращает?

public synchronized void sendCommand(String command) throws IOException
{
    byte[] commandBytes = (command + "\n").getBytes(UTF_8.name());
    outputStream.write(commandBytes);
    outputStream.flush();
}

Предпочтительно также возвращать выходные данные процесса за это время.Это будет поведение по умолчанию для неинтерактивной команды оболочки, которая завершается после завершения выполнения.read() блокируется на неопределенный срок до тех пор, пока процесс не завершится, и я не хочу жестко задавать длину ожидаемого вывода процесса или аналогичных хаков, чтобы обойти этот недостаток.

1 Ответ

0 голосов
/ 22 июня 2019

Я решил переписать свой бинарный файл, чтобы он снова не был интерактивным. Получается, что ожидаемый прирост производительности был незначительным, поэтому больше не было причин поддерживать его в интерактивном режиме и увеличивать трудности с реализацией.

...