2013-10-10 4 views
0

Le code principal est de suivre:A propos de bash, la planification des processus et printf()

int main(){ 
    pid_t pid=fork(); 
    if(pid==0){ 
     printf("a\n"); 
     exit(0); 
    } 
    else 
     printf("b\n"); 
    return 0; 
} 

La sortie est suit:

b 
[email protected]:/mnt/LinuxDatum/WorkSpace/Ubuntu$ a 

La question est: Pourquoi « aimager @ cong-Ubuntu:/mnt/LinuxDatum/WorkSpace/Ubuntu $ "sortie frontale dans un

+2

Si vous demandez A propos de la séquence, il se peut que ce ne soit pas toujours le cas, le processus fils peut sortir en premier, le parent peut également sortir en premier. –

Répondre

1

Vous avez exécuté un processus au premier plan, donc shell attend son retour avant de demander la commande suivante. Ce processus lance un autre processus enfant qui, pour shell, est en arrière-plan. Lorsque le processus initial se termine, shell, ignorant tout des sous-processus qu'il n'a jamais lancés, vous demande la commande suivante avec l'invite de commande (dans votre cas - nom d'utilisateur @ nomhôte:/current/working/directory $), mais après ce processus imprime quelques données. Invite est déjà là, personne ne va l'enlever, donc ces données viennent d'être ajoutées ici.

Cela n'affecte que la façon dont vous voyez les choses. Shell n'a pas reçu ces données, il n'est donc pas ajouté à la chaîne de commande, il s'affiche simplement de cette façon. Vous pouvez appuyer sur retour pour forcer une nouvelle invite si vous souhaitez voir une ligne vierge.

Vous pouvez voir tout à fait les mêmes résultats avec

$ (echo foo; echo bar) & 

(& est commande shell pour lancer processus en arrière-plan - demander la commande suivante sans attente d'une commande précédente pour terminer)