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