la compréhension de fork(), sleep() et les processus de flux
Pratique avec ces appels système, mais je coincé dans ce code:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
main()
{
pid_t pid;
switch(pid = fork())
{
case -1:
printf("fork failed");
break;
case 0: //first child
printf("\ni'm the first child, my pid is %d", getpid());
fflush(stdout);
break;
default: //parent
sleep(5); /** sleep is generating problems **/
printf("\ni'm the parent process, my pid is %d", getpid());
printf("\ngenerating a new child");
fflush(stdout);
switch(pid = fork())
{
case -1:
printf("fork failed");
break;
case 0: //second child
printf("\nhere i am, the second child, my pid is %d", getpid());
break;
default: //parent
wait((int *)0);
printf("\nback to parent, my pid is %d", getpid());
}
}
return 0;
}
La sortie que j'obtiens est:
je suis le premier enfant, mon pid est 6203 je suis le processus père, mon pid est 6202 la génération d'un nouvel enfant de retour à parent, mon pid est 6202 Le processus a retourné 0 (0x0) execution time: 5.004 s Appuyez sur ENTRÉE pour continuer je suis ici, et le deuxième enfant, mon pid est 6204
Ce que j'essaie, c'est une simple impression de ces messages, la gestion de la synchronisation via sleep()
.
Je ne comprends pas pourquoi le programme est de retour, avant l'impression, le deuxième enfant de message.
Le cas par défaut(celui qui est juste après la seconde fourche) imprimé devant son enfant(deuxième) agissant sur la sortie comme il est d'ignorer ses wait()
. Son enfant a donc imprimé après le processus retourne.
Je n'étais pas en mesure de déterminer quel est le problème. J'ai marqué sleep() de la fonction car, si je les remplacer par wait((int *)0);
les processus de flux de travail est la façon dont il a été conçu pour (de toute façon, sans date).
À ce point, je ne suis pas sûr au sujet de processus de flux, ou le sommeil (les) utilisation (pages man n'était pas utile, de manière trop concise pour être honnête).
OriginalL'auteur init6eb | 2011-11-17
Vous devez vous connecter pour publier un commentaire.
En fait, votre appel à l'attente de travaux. Il détecte la fin de la première enfant de processus et continue par la suite. Si vous n'deux appels consécutifs à wait(), vous obtiendrez le bon comportement.
Mis à jour le code de test :
De sortie :
Vous êtes les bienvenus, bonne chance avec le reste de votre étude 😉
OriginalL'auteur BenC
La page de man pour attendre, dit le texte suivant:
D'attente est de retour en raison de la naissance du premier enfant.
OriginalL'auteur Jim Clay