Не получается управлять дочерними процессами (pcntl_fork)

nirex

Новичок
Не получается управлять дочерними процессами (pcntl_fork)

Привет всем.
У меня не получается управлять дочерними процессами, т.е. есть цикл "заданий" который запускает форки , но т.к. заданий может быть много значит надо ограничить число форков .
пока максимум дочерних задействовано нечего не делать , как только освобождается место , сразу запускать еще один дочерний процесс.
Напишите пожалуйста пример , а то что-то не получается . долго бился , но нечего так и не сделал.

я пытался реализовать это так :
$max_fork=3
$childrenNow=0;
for(задания){

while($childrenNow>=$max_fork){sleep(5);}
$pid = pcntl_fork();

if ( $pid == -1 ) {
die( "error\n" );
} elseif ( $pid == 0 ) {

$childrenNow++;

}else{
global $childrenNow;
include_once("main1.php");
simple_download($id,$folder_id,$cell_name,$cell_desc);

$query="update `tmpl` set `complete`='1' where `id`=\"$tempid\"";
$result = mysql_query($query);
if(!$result)mysql_eror();
echo $childrenNow--;
posix_kill(posix_getpid(), SIGTERM);
}

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

Demiurg

Guest
ты знаешь, что происходит с переменными при форке ?
 

nirex

Новичок
что ?
пробовал смотреть вот эти переменные
$id,$folder_id,$cell_name,$cell_desc
показались как надо
 

Demiurg

Guest
$a=0;
$pid = pcntl_fork();
if ( $pid )
{
$a++;
echo $a;
sleep(2);
$a++;
echo $a;
}
else
{
sleep(1);
$a++;
echo $a;
sleep(1);
$a++;
echo $a;
}

что получим ?
 

Demiurg

Guest
интересно .. как это echo 4 штуки, а в результате получаем только одну цифру ?
 

nirex

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

Demiurg

Guest
>а результат будет 1122
а можешь объяснить ? мне вот кажется, что это зависит от некоторых факторов.

>да еще хва прикалываться , неужели нельзя просто нормально помочь
небе нужна помощь или готовое решение ?
 

nirex

Новичок
1. т.к. это как две разные программы под которые выделяются два разных сегмента памяти
2.мне нужна помощь как это решить не через txt файл , как еще можно
 

Demiurg

Guest
хорошо, будем считать, что ты понимаешь ... тогда что значит
global $childrenNow; у тебя в коде ?
 

nirex

Новичок
массив находящийся в глобальной области , т.е. в <?php
здесь
?>
но никак не в функциях, если надо эту переменную перем ее таким способом global $childrenNow; или $GLOBALS["childrenNow"];
также в этом массиве находятся переменные которые можно передавать от одной странички к другой (такой способ не желателен , возможен взлом).

вообще перестань а ?
типа за тупость надо отвечать ? :)
 

Tor

Новичок
nirex
pcntl_waitpid()

им ждешь, когда умрет дочерний процесс и запускаешь новый
 

Demiurg

Guest
Tor
он не понимает, что получается при форке, а ты ему рассказываешь, как узнать о завершении чаилд-процесса
 

nirex

Новичок
Автор оригинала: Demiurg
Tor
он не понимает, что получается при форке, а ты ему рассказываешь, как узнать о завершении чаилд-процесса
да не понимаю , но неужели не объяснить .
я не пойму откуда такие умные как ты бирутся , чего-то учат , учат а толком объяснить чего да как не хотят.
на хрен вообще тогда писать.
или ты на рекорд по постингу идешь ?
 

Tor

Новичок
nirex
ты серьезно думаешь, что так разговаривая, дождешься ответов?
ты серьезно думаешь, что кому-то здесь станет хуже, если ты не решишь свою проблему?
 
Сверху