2012-01-26 4 views
3

Так что я хочу иметь возможность сделать следующее на PHP. Из командной строки я вызываю скрипт.php command line reader

/usr/bin/php mychildren.php 

Я хочу, чтобы скрипт мог создавать 2 дочерних процесса, оба из которых остаются активными на неопределенный срок. (скажем, мы делаем их бесконечными циклами = D), но я хочу, чтобы дочерние процессы время от времени отзывались приветствия для первого процесса и до свидания для второго процесса. И затем, когда я делаю прерывание сигнала (ctrl + c) с помощью pcntl_signal, я могу затем убить 2 дочерних процесса, и как только у меня будет подтверждение, что они убиты, я убью родительский процесс.

Возможно ли это? Я немного посмотрел на потоки, и я очень смущен тем, как заставить это работать. Похоже, это должно сработать, но я не могу заставить что-то работать нормально.

Дополнительная информация: 2 ребенок обрабатывает каждый дочерний процесс иногда Echos что-то случайное когда я убить родителей дети умирают, и как только они мертвы, то родитель умирает

+0

Вы можете посмотреть на это: http://php.net/manual/en/refs.fileprocess.process.php Вероятно, вы захотите немного IPC, а что нет. – Brad

ответ

1

В то время как вы можете использовать pcntl_fork для создания подпроцесса , часто лучше выполнять подпроцессы заново с proc_open. Используйте pcntl_signal для установки обработчиков сигналов (чтобы убить подпроцессы). Если вы хотите, чтобы дочерние процессы напрямую писали на один и тот же вывод, вам придется реализовать какой-то IPC, чтобы избежать одновременной записи.

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

+0

Как бы вы позволили обоим детям писать основные процессы? Так скажем, например, дочерние процессы - это «echo» hello »;« Как бы я захватил это эхо из родительского процесса, чтобы написать его? Могу ли я отследить их от родителя, даже когда выполняются дочерние процессы? –

+0

Самый простой способ сделать это - вызывать ['proc_open'] (http://php.net/proc_open) вместо' fork', так как 'proc_open' будет прозрачно обрабатывать все внутренние элементы для вас. Если вы должны использовать 'fork' (например, из-за причин производительности или из-за того, что вы хотите получить доступ к значительным частям основной программы и ее данных в дочерних элементах), вы можете создать именованный канал с помощью' 'posix_mkfifo' '(http: //php.net/manual/en/function.posix-mkfifo.php). К сожалению, php, похоже, не имеет обертку для ['pipe'] (http://linux.die.net/man/2/pipe) прямо сейчас. – phihag

+0

В итоге я использовал вилки, потому что вся концепция proc_open меня смущает. Я не знаю, как обязательно ждать родителя и иметь возможность контролировать все процессы, которые он открывает. Может быть, в будущем я научусь это делать. Спасибо хоть! –