2009-06-18 5 views
4

Nous devons dire les résultats du programme C:Résultat d'un petit programme 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); 
} 

Ma première attente est 3. Lorsqu'un appel de la fourche est faite, la mémoire du processus est copié, et les deux programmes fonctionnent. Le processus enfant s'exécute alors, mais k est toujours égal à 2. Donc, à la fin, il exécute 1 + 2 = 3;

Mais quand ce programme est exécuté, il produit 153. Je n'ai pas l'indice le plus proche pourquoi il sort cela.

Quelqu'un peut-il dire pourquoi?

Répondre

15

La raison pour laquelle vous avez 2 processus d'impression sur la même console. "fork" est une commande unix/linux qui est appelée une fois et retourne deux fois. L'un des retours sera dans le processus original qui a appelé fork et retournera le PID du processus fils engendré. Le deuxième retour sera 0 et cela indique que c'est le processus fils.

L'un des programmes, l'enfant je crois, s'exécute en premier et calcule 15 comme la valeur et l'imprime à la console en dernier. Le programme parent s'exécute en second à cause de l'attente (0) et produit la valeur 3.

+0

biensur. Totaly a oublié que les deux processus produisent des résultats. – Ikke

+2

Je crois que vous avez raison. Vous pouvez rapidement discerner si c'est le cas en changeant la dernière ligne du programme à: printf ("% d \ n", som); – LBushkin

4

15 est imprimé par l'enfant, et 3 par le parent.

0

Aucune nouvelle ligne n'étant imprimée entre les valeurs, la réponse du parent apparaît immédiatement après la réponse de l'enfant.

Jared est correct sur la cause des valeurs.

2

A est parent, B est l'enfant, voici les lignes importantes:

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