Question

Nous devons indiquer les résultats du programme C suivant:

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 de 3. Lorsque vous appelez le fork, la mémoire du processus est copiée et les deux programmes sont exécutés. 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 en sort 153. Je ne sais pas pourquoi il le sort.

Quelqu'un peut-il dire pourquoi?

Était-ce utile?

La solution

La raison en est que vous avez 2 processus qui s’impriment sur la même console. " fourchette " est une commande unix / linux appelée une fois et renvoyée deux fois. L'un des retours sera dans le processus original qui a appelé fork et retournera le PID du processus enfant qui a été engendré. Le deuxième retour sera 0 et cela indique qu'il s'agit du processus enfant.

L’un des programmes, l’enfant, je crois, s’exécute d’abord et calcule 15 en tant que valeur et l’imprime en dernier sur la console. Le programme parent s'exécute en second en raison de l'attente (0) et produit la valeur 3.

Autres conseils

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

A est le 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

Aucune nouvelle ligne n'étant en cours d'impression entre les valeurs, la réponse du parent apparaît juste après la réponse de l'enfant.

Jared a raison sur la cause des valeurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top