На внешнем порту как только закрыть выход и ждать exit_status - PullRequest
1 голос
/ 04 июля 2011

Я использую порт для запуска конвейера с несжатыми и некоторыми данными dd:

Port = open_port({spawn, "bzcat | sudo dd of=/dev/foo}, 
                 [stream, use_stdio, exit_status]),

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

Я хотел бы дождаться этого завершения, а также захватить exit_status.

Когда я просто звоню port_close, мне кажется, что конвейер просто завершен, и ждать завершения не приходится. Также я не получаю exit_status ....

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

Сделал несколько экспериментов, и похоже, что, по крайней мере, port_close не убивает процесс, вы просто не узнаете, когда он закончится. Это правильно?

Ответы [ 2 ]

3 голосов
/ 04 июля 2011

Если вам просто нужно дождаться появления команды open_port, вам нужно дождаться сообщения exit_status:

1> Port = open_port({spawn, "sleep 7"}, [exit_status]).                   
#Port<0.497>
2> receive {Port, {exit_status, Code}} -> Code after 10000 -> timeout end.
0

Обновление (скажем, порт просто закроет выходной канал): Я думаю, вы не можете просто закрыть выходной канал с помощью драйвера порождения по умолчанию. Драйвер по умолчанию не имеет управляющих команд и port_close, хотя не уничтожает порожденную команду, но полностью стирает все состояние порта.

Возможные решения:

  • Сначала записать поток ввода в файл, а затем запустить последовательность bzip/dd для этого файла;
  • Напишите свой собственный драйвер или NIF (может быть, некоторые реализации с открытым исходным кодом уже существуют?)
  • Использование некоторого внешнего сценария и протокола управления, например, полная (или порция) длина может быть передана до фактического содержимого, чтобы сценарий знал, когда закрывать соединение
0 голосов
/ 04 июля 2011

Несколько довольно уродливых решений этой проблемы можно найти здесь: ограничения erlang: open_port () и os: cmd ()

Некоторые даже используют netcat для сопоставления проблемы с TCP-соединением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...