Esito di un piccolo programma C.
Domanda
Dobbiamo dire il risultato del seguente programma C:
main()
{
int pid, k, som;
som = 0; k = 2;
pid = fork();
if(pid == 0)
k=5;
else
wait(0);
for(int i = 1; i <= k; i++)
som += i;
printf("%d", som);
}
La mia prima aspettativa è 3. Quando viene effettuata una chiamata fork, la memoria del processo viene copiata ed entrambi i programmi vengono eseguiti. Quindi il processo figlio viene eseguito, ma k è ancora uguale a 2. Quindi alla fine, esegue 1 + 2 = 3;
Ma quando questo programma viene eseguito, genera 153. Non ho la più pallida idea del perché lo produca.
Qualcuno può dire perché?
Soluzione
Il motivo per cui hai 2 processi di stampa sulla stessa console. & Quot; forcella " è un comando unix / linux che viene chiamato una volta e ritorna due volte. Uno dei ritorni sarà nel processo originale che ha chiamato fork e restituirà il PID del processo figlio generato. Il secondo ritorno sarà 0 e questo indica che è il processo figlio.
Uno dei programmi, credo, il bambino esegue per primo e calcola 15 come valore e lo stampa per ultimo sulla console. Il programma padre viene eseguito secondo a causa dell'attesa (0) e produce il valore 3.
Altri suggerimenti
15
è stampato dal bambino e 3
dal genitore.
A è il genitore, B è il figlio, ecco le linee importanti:
A: pid = fork(); // returns 0 for the child process
A: wait(0);
B: k = 5;
B: for(int i = 1; i <= k; i++) som += i; // som = 15
B: printf("%d", som); // prints 15, B finishes, goes back to A
A: for(int i = 1; i <= k; i++) som += i; // som = 3
A: printf("%d", som); // prints 3
Non è stata stampata una nuova riga tra i valori, quindi la risposta del genitore appare subito dopo la risposta del bambino.
Jared ha ragione sulla causa dei valori.