Я использую PHP и pcntl_fork(). Идея состоит в том, что родитель разветвляется и делает паузу для завершения ребенка; ребенок выполняет задание, затем завершается; родитель может проверить код возврата для задачи или состояние дочернего процесса и продолжить соответствующим образом.

(Задача изолирована от основного родителя путем разветвления, чтобы родитель мог хорошо очиститься, если задача сталкивается с непреодолимой проблемой времени выполнения, такой как поврежденные файлы "include" или отсутствующие библиотеки ключей, отсюда и ответвление, в основном я реализую простая изоляция процесса для, как мы надеемся, редкого случая, когда необратимое условие может вызвать проблемы)

Таким образом, проблема в том, что после pcntl_fork() оба процесса совместно используют одни и те же дескрипторы ввода-вывода STDXXX, поэтому, как только дочерний процесс завершает свою задачу, ввод-вывод, который он использует, как обычно, закрывается, и поэтому они закрываются для родителя как ну, это означает, что такие вещи, как echo(), используемые для продолжения взаимодействия с родителем, тоже внезапно перестают работать.

Я следую совету на php.net и использую posix kill -9 в дочернем элементе вместо exit, так что дочерний процесс завершается без закрытия IO, совместно используемого (и необходимого) для родителя, но есть более удобный способ сделать это ?

Спасибо!

1 ответ1

0

Перед pcntl_fork() вы можете "дублировать" желаемые дескрипторы файлов, открыв, например, php://stdout и php://stderr или php://fd/3 . Смотрите протоколы php.


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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .