2017-08-15 2 views
0
int main() { 
int p1, p2; 
printf("A\n"); // we always print A first 
p1 = fork(); 

if (p1 == 0) { // child 
    printf("B\n"); 

    p2 = fork(); // fork 

    if (p2 == 0) { 
     sleep(2); 
     printf("C\n"); 
     exit(0); 
    } 
    wait(0); // parent waits for child to finish 
} 
printf("D\n"); 
exit(0); 


return 0; 
} 

La sortie que je reçois est la suivante:Quelle est la sortie du programme de fourches suivant?

A // always first 

B or D // whether we are in parent or child. Program may be terminated here 

C // always since parent of p2 waits 

D // since p2 parent exits if condition, prints D, then exits(0) 

J'ai couru ce 100 fois et toujours je reçois ABD ... terminate ... CD. Le «D» vient toujours avant le «B». Est-ce juste aléatoire ou y a-t-il une raison que je ne vois pas?

Merci.

+0

Est-ce que vous obtenez toujours ADBCD, ou le programme se termine-t-il parfois après la deuxième lettre? Vous semblez avoir posté des informations contradictoires. –

+0

ABD ... terminer ... CD –

+1

Voir cette réponse en particulier la partie sous Quatrième: https://stackoverflow.com/a/6697102/13422 –

Répondre

1

La sortie exacte dépend entièrement de la manière dont le système d'exploitation planifie chaque processus. Il n'y a pas de synchronisation entre le parent et le premier enfant, donc "B" et "D" peuvent imprimer dans n'importe quel ordre.

Par exemple, sur ma machine je reçois "ADB (end) CD".