Ниже приведен пример функции Fork в действии. Ниже также вывод. Мой главный вопрос, связанный с вилкой, называется изменением значений. Таким образом, pid1,2 и 3 начинаются с 0 и меняются по мере того, как вилки случаются. Это потому, что каждый раз, когда вилка происходит, значения копируются в дочерний элемент, а конкретное значение изменяется в родительском? В основном, как значения изменяются с помощью функций fork?
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
pid_t pid1, pid2, pid3;
pid1=0, pid2=0, pid3=0;
pid1= fork(); /* A */
if(pid1==0){
pid2=fork(); /* B */
pid3=fork(); /* C */
} else {
pid3=fork(); /* D */
if(pid3==0) {
pid2=fork(); /* E */
}
if((pid1 == 0)&&(pid2 == 0))
printf("Level 1\n");
if(pid1 !=0)
printf("Level 2\n");
if(pid2 !=0)
printf("Level 3\n");
if(pid3 !=0)
printf("Level 4\n");
return 0;
}
}
Тогда это выполнение.
----A----D--------- (pid1!=0, pid2==0(as initialized), pid3!=0, print "Level 2" and "Level 4")
| |
| +----E---- (pid1!=0, pid2!=0, pid3==0, print "Level 2" and "Level 3")
| |
| +---- (pid1!=0, pid2==0, pid3==0, print "Level 2")
|
+----B----C---- (pid1==0, pid2!=0, pid3!=0, print nothing)
| |
| +---- (pid1==0, pid2==0, pid3==0, print nothing)
|
+----C---- (pid1==0, pid2==0, pid3!=0, print nothing)
|
+---- (pid1==0, pid2==0, pid3==0, print nothing)
В идеале ниже показано, как я хотел бы, чтобы это объяснялось, поскольку этот способ имеет смысл для меня. В этом моя главная путаница. Когда дочерние вилки, например, pid1 = fork();
, который создает процесс со всеми значениями родительского элемента, но делает ли он это значение, например, разрешает говорить 1 родителям pid1? Значение у ребенка было бы pid 1 = 0, pid2 = 0 и pid3 = 0, а родительский тогда как pid1 = 2 и pid2 и 3 равны 0?