Не знаю, можно ли это назвать достижением, но вот таки решил начать писать сам...
Сразу скажу, сильно не судите, потому как вообще раньше с процессами и демонами не дружил...
Также хочу выразить RESPECT -
Akick Именно благодаря ему глянул в сторону pcntl_PHP !!!, хотя и не знаю, что будет в итоге...
А теперь, в двух словах, что получилось:
1) При запуске демона, сразу же создается 3 процесса, я их назвал так: "Main process, Client process, Server process".
На экран выводятся сообщения запущенного процесса и его PID:
Запуск дочернего процесса: 31765
Запуск дочернего процесса: 31766
Запуск главного процесса: 31764
2) Процессы действительно создаются и устойчиво работают, как и должно быть...!
3) В процессах Client process и Server process происходит независимая запись в файлы
4) В Main process попытался написать слежение за дочерними просессами, правда без использ. сигналов...
В результате, если прибить один из доч. процессов, Main process выводит в консоль сообщение:
Процесс 31766 был неестественно уничтожен
Если прибить и второй доч. проц., то демон в целом завершает работу. То есть получилось, что Main ждет завершения
потомков и вырубается сам...
Если прибить Main первым то доч. процессы продолжают свое независимое существование
Вот собственно код:
PHP:
#!/usr/bin/php -q
<?PHP
$child = array();
// Запускаем CLIENT - дочерний процесс
if(($pid = pcntl_fork()) == 0) {
exit(client_process());
}else{
$child[] = $pid;
}
// Запускаем SERVER - дочерний процесс
if(($pid = pcntl_fork()) == 0) {
exit(server_process());
}else{
$child[] = $pid;
}
//print_r($child);
$my_pid = getmypid();
print "Запуск главного процесса: $my_pid\n";
# ****************** Main process ********************************************
// Здесь, наверно, будем обрабатывать сигналы от дочерних
// процессов и возможно перезапускать, в случае ошибки !!
foreach($child as $pid) {
$pid = pcntl_wait($status);
if(pcntl_wifexited($status)) {
$code = pcntl_wexitstatus($status);
print "Процесс $pid возвратил код выхода: $code\n";
}
else {
print "Процесс $pid был неестественно завершон\n";
}
}
# ****************** Client process ******************************************
function client_process(){
$my_pid = getmypid();
print "Запуск дочернего процесса: $my_pid\n";
while(true){
sleep(1);
$fk = fopen('/tmp/daemon1.log', 'a');
fwrite($fk, date("Y/m/d H:i:s "). "1111111111\n");
fclose($fk);
}
}
# ****************** Server process ******************************************
function server_process(){
$my_pid = getmypid();
print "Запуск дочернего процесса: $my_pid\n";
while(true){
sleep(1);
$fs = fopen('/tmp/daemon2.log', 'a');
fwrite($fs, date("Y/m/d H:i:s "). "2222222222\n");
fclose($fs);
}
}
# ******************************************************************************
?>
Теперь вижу задачу в следующем:
1) Пока не знаю как передать значение переменной из сервера клиенту и наоборот....
2) Попробовать вписать реальный код Socket - сервера и клиента, попробовать...
3) Добиться всетаки, чтоб по завершении Main processa падали и потомки...
4) Разобраться в управлении сигналами, а то ф-я pcntl_wait не дает обрабатывать дальнейший код в Main(Это я не понял)
И т.д.
Может кому пригодиться именно такое начальное решение, я пока прицеливаюсь...
Господа эксперты, что скажете по коду, что посоветуете, чем может поможете...?