Originariamente inviato da zipangulu
avviando questo codice,vedo che ciò che è stampato a video è:
PARENT: value = 5
mentre io avrei detto che avrebbe stampato:
PARENT: value = 20
ma il problema è che non ho capito il perchè viene 5
Ricapitolando:
si crea una variabile intera value e la si inizializza a 5
nel main viene invocata la system call fork per creare un nuovo processo e si salva il valore di ritorno del metodo in pid
a questo punto entra nel secondo if (processo padre) che esegue il wait(NULL),se non sbaglio così facendo dovrebbe attendere la terminazione del codice del processo figlio,quindi si va nel primo if (relativo al codice del processo figlio) il quale incrementa value di 15,che a questo punto dovrebbe valere 20 ora l'esecuzione torna al padre che esegue il printf ma stampa il valore di value come 5 e non 20 come io credevo...mi spiegate il perchè?
dov'è che sbaglio il mio ragionamento?
Per iniziare ti consiglio di indentare il codice, diventa tutto più leggibile (anche se sarebbe un po' da rivedere):
codice:
#include <sys/type.h>
#include <stdio.h>
#include <unistd.h>
int value = 5;
int main() {
int pid = fork();
if (pid == 0) {
value += 15;
return 0;
} else if (pid > 0){
wait(NULL);
printf("PARENT: value = %d", value);
return 0;
}
}
Ricorda che se pid == 0 sei nel codice del figlio. Con pid > 0 invece sei nel padre (in questo caso l'intero rappresenta il pid del processo figlio).
Quindi all'interno del padre value varrà 20 mentre all'interno del figlio resta 5. Occhio che a partire dalla fork hai due processi differenti (in cui il figlio è la copia del padre), ognuno con la propria area di memoria! Il value del padre e quello del figlio ora sono due variabili diverse (se ricordo bene, è un po' che non programmo su unix).