Старый вопрос, но все же интересный. Страница man для fork()
сообщает нам, что возвращаемое значение:
В случае успеха PID дочернего процесса возвращается в родительском, а 0 - в дочернем. В случае ошибки -1 возвращается в родительский процесс, дочерний процесс не создается и значение errno устанавливается соответствующим образом.
Итак, мы знаем, что fork()
возвращает 0 ребенку, мы можем использовать его в качестве механизма управления:
int main()
{
// Here we're in the parent (0) process
if(fork()) // This starts the chain, only the parent will do this
if(!fork()) //the child will pass this, the parent will skip it
for(count = 0; counter < number_of_processes; counter++) //now the 2nd child loops
{
if(fork())
if(!fork());
else
break;
}
Давайте добавим несколько цифр к нему:
//parent (18402)
if(fork()) // spawns 18403, parent 18402 keeps going
if(!fork()) // spawns 18404, parent 18402 drops to the end of main()
for(count = 0; count < number_of_processes; conter++) // 18404 enters here
if(fork()) // 18404 forks 18405 and then goes on
if(!fork()); // 18404 spawns 18406 before leaving, 18406 restarts the loop
else
break; // 18404 breaks out there
else
break; //18405 leaves the loop here
Итак, после одной итерации имеем:
18402
|
+---> 18403
|
+---> 18404
|
+----> 18405
|
+----> 18406
|
После этого мы продолжим цикл двух новых процессов, второй из которых будет повторяться, пока вы не сделаете столько проходов, сколько требуется.