Объясните пожулайста незнающему... pcntl_fork()

GrayMaster

Новичок
Это понятно что для реализации задуманого нужно использовать "pcntl" - но как ? :(
 

nerezus

Вселенский отказник
>> Замечание: Для Windows-платформ это расширение недоступно.
Обидно...
 

Profic

just Profic (PHP5 BetaTeam)
>> Замечание: Для Windows-платформ это расширение недоступно.
Обидно...
А что вы хотели, если в Windows вообще нет такого понятия как fork? Хотя можно собрать php под cygwin-ом, тогда и в винде будет форк. Правда эмулированный.
 

nerezus

Вселенский отказник
Profic
в перле под винду интерпретатор его эмулирует по умолчанию =)
 

GrayMaster

Новичок
Вот что у меня получилось:
PHP:
declare(ticks = 1);

define("SIG_END", 50);
define("SIG_COMPLETE", 51);

$max = 5;

// function for signal handler
function sig_handler($signo) {
        global $do;
        
        switch ($signo) {
            case SIG_END:
             echo "Caught SIG_END...\n";
             
             break;
            case SIG_COMPLETE:
             echo "Caught SIG_COMPLETE...\n";
             $do = false;
             
             break;
        }
}

function exec_child($i) {
        sleep(3);
        
        echo "Child #".posix_getpid()."\n";
        if ($i == 7) {
                posix_kill(posix_getppid(), SIG_COMPLETE);
        }

        posix_kill(posix_getppid(), SIG_END);
}

// install signal handler for dead kids
pcntl_signal(SIG_END, "sig_handler");
pcntl_signal(SIG_COMPLETE, "sig_handler");

$pids = array();
$do = true;

while ($do) {
        if (count($pids) >= $max) {
                $child_pid = pcntl_waitpid(-1, $status);
                unset($pids[array_search($child_pid, $pids)]);
        }

        $pid = pcntl_fork();

        if ($pid == -1) {
                die("Could not fork!");
        } elseif ($pid) {
                $pids[] = $pid;
        } else {
                exec_child($i);
                exit();
        }

        $i++;
}
Зарегистрировал 2 сигнала, один сиглан - конец выполнения потомка, второй - говорит что потомкам больше нечего выполнять, и вырубает цикл...

Проблема вот в чём: как я могу передать от потомков в программу какое либо число ? Например я бы хотел следить за процессом общего хода выполнения программы - т.е. мне нужно получать от потомков кол-во успешно/неудачно выполненых операций.
Можно ли передать эти данные числом ? Или на каждой успешно/неудачно выполненой операции слать сигнал в главный процесс ?
 
Сверху