Poniżej znajduje się przykład funkcji wideł w akcji. Poniżej znajduje się również wynik. Moje główne pytanie związane z widelcem to jak zmieniają się wartości. Więc pid1,2 i 3 zaczynają się od 0 i zmieniają się, gdy pojawiają się widły. Czy dzieje się tak dlatego, że za każdym razem, gdy widelec się dzieje, wartości są kopiowane do dziecka, a określona wartość zmienia się w rodzicu? Zasadniczo jak zmieniają się wartości za pomocą funkcji fork?Funkcja widełek() w C
#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;
}
}
To jest egzekucja.
----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)
Idealnie poniżej jest to, jak chciałbym to wyjaśnić, ponieważ ma to dla mnie sens. * Tutaj znajduje się moje główne zamieszanie. Kiedy dziecko rozwidla się na przykład pid1 = fork();
, który tworzy proces ze wszystkimi wartościami rodzica, ale czy przekazuje dalej wartość, powiedzmy powiedzmy 1 do pid1 rodziców? Oznacza to, że dziecko miałoby pid 1 = 0, pid2 = 0 i pid3 = 0, a rodzic następnie jako pid1 = 2, a pid2 i 3 równe 0?
widelec() tworzy nowy proces, który pobiera kopię danych niepełnych, jak to było przed fork(). Również wywołanie fork() może mieć trzy wyniki, nie tylko 2 lub 1 (kod robi) Trzy Wyniki są następujące: <0 oznacza błąd = 0 oznacza, dziecko,> 0 oznacza rodzica. Kod powinien zawsze sprawdzać wszystkie trzy wyniki. TO ZNACZY. to: 'pid2 = fork();/* B */ pid3 = fork();/* C */"jest złą praktyką kodowania, ponieważ nie wiadomo, który proces wytworzył" C "(faktycznie będzie 2 z procesów" C ") Podobne rozważania istnieją dla procesu" E " – user3629249
dzieci" B "i" C " nigdy nie dochodzi do instrukcji printf() z powodu wcześniejszej instrukcji "if". Tylko "A", "D" i "E" docierają do instrukcji printf(). – user3629249
youtube.com/watch?v=WcsZvdlLkPw w tym procesie nadrzędnym ma wartość nadpisana przez identyfikator procesu childs jest to poprawne? – Plisken