Di seguito è riportato un esempio della funzione Fork in azione. Di seguito è riportato anche l'output. La mia domanda principale ha a che fare con un fork chiamato come i valori sono cambiati. Quindi pid1,2 e 3 partono da 0 e cambiano quando le forche si verificano. Questo perché ogni volta che si verifica un fork, i valori vengono copiati al figlio e il valore specifico viene modificato nel genitore? In pratica come cambiano i valori con le funzioni della forcella?Funzione Fork() in 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;
}
}
Quindi questa è l'esecuzione.
----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)
Idealmente sotto è come mi piacerebbe vederlo spiegato come in questo modo ha senso per me. I * sono dove risiede la mia principale confusione. Quando il bambino si biforca per esempio pid1 = fork();
che crea un processo con tutti i valori del genitore, ma poi passa un valore come diciamo 1 ai genitori pid1? Significa che il bambino avrebbe pid 1 = 0, pid2 = 0 e pid3 = 0 e il genitore allora come pid1 = 2 e pid2 e 3 uguale a 0?
un fork() crea un nuovo processo, che ottiene una copia dei dati principali, come era prima della fork(). Inoltre, un call to fork() può avere tre risultati, non solo 2 o 1 (come sta facendo il codice) i tre risultati sono: <0 significa errore, = 0 significa figlio,> 0 significa genitore. Il codice dovrebbe sempre verificare tutti e tre i risultati. OSSIA questo: 'pid2 = fork();/* B */ pid3 = fork();/* C */'è una cattiva pratica di codifica in quanto non si sa quale processo abbia creato 'C' (in realtà ci saranno 2 dei processi 'C') Considerazioni simili esistono per il processo 'E' – user3629249
bambini 'B' e 'C' mai raggiungere le istruzioni printf() a causa della precedente dichiarazione "if". Solo 'A', 'D' e 'E' raggiungono mai le istruzioni printf(). – user3629249
youtube.com/watch?v=WcsZvdlLkPw in questo il processo genitore ha un valore sovrascritto dall'ID del processo figlio è corretto? – Plisken