Я сделаю это немного более наглядным:
Шаг 1
// Program 1
#include <stdio.h>
int main (){
printf("PID:%d\n",getpid());//print1:P1
fork(); // <- Current Line
fork();
fork();
printf ("Done"); //print2:P2
}
Шаг 2
Когда эта строка выполняется, она разбивается на две программы:
// Program 1 >----|
#include <stdio.h> |
int main (){ |
printf("PID:%d\n",getpid());//print1:P1 |
fork(); // Returns child's PID [Program 1 Version 2] |
fork(); // <- Current line |
fork(); |
printf ("Done"); //print2:P2 |
} |
|
// Program 1 Version 2 (Child of Program 1) >----| |
#include <stdio.h> | |
int main (){ | |
printf("PID:%d\n",getpid());//print1:P1 | |
fork(); // Returns 0, since it's a child | |
fork(); // <- Current line | |
fork(); | |
printf ("Done"); //print2:P2 | |
} | |
Шаг 3
Когда программа 1 версии 2 выполняет свою текущую строку, она создает
// Program 1 Version 2 <-----| |
#include <stdio.h> | |
int main (){ | |
printf("PID:%d\n",getpid());//print1:P1 | |
fork(); | |
fork(); // Returns child's PID [Program 1 Version 2] Version 2 |
fork(); // <- Current line | |
printf ("Done"); //print2:P2 | |
} | |
v----| |
// [Program 1 Version 2] Version 2 (Child of Program 1 Version 2) |
#include <stdio.h> |
int main (){ |
printf("PID:%d\n",getpid());//print1:P1 |
fork(); |
fork(); // Returns 0 (It's a new child) |
fork(); // <- Current line |
printf ("Done"); //print2:P2 |
} |
Когда программа 1 выполняет свою текущую строку, она создает
// Program 1 <------------|
#include <stdio.h> |
int main (){ |
printf("PID:%d\n",getpid());//print1:P1 |
fork(); |
fork(); // Returns child's PID [Program 1 Version 3] |
fork(); // <- Current line |
printf ("Done"); //print2:P2 |
} |
|
// Program 1 Version 3 (Child of Program 1) <-----------|
#include <stdio.h>
int main (){
printf("PID:%d\n",getpid());//print1:P1
fork();
fork(); // Returns 0 (Is a new child)
fork(); // <- Current line
printf ("Done"); //print2:P2
}
Шаг 4
Каждая из последних вилок снова дублирует каждую программу, в результате чего у вас работает 8 программ.Каждая оригинальная программа получает PID ребенка, возвращаемый fork.Каждая дочерняя программа получает 0. Затем все они printf("Done")
Примечание
После того, как программа сгенерирована, она просто запускает все вилки и получает кучу PID, а затем печатает.Просто так получается, что каждая ветвь делает ребенка дочерним, но родитель этого не замечает, и они в основном НЕТ-ОП для родителя.