La difficulté avec dup2, stdout, et stderr

Lorsque ce programme est exécuté, le "stderr" la ligne est affichée avant que le "stdout" de ligne. Pourquoi? J'ai pensé dup2 ferait stderr et stdout utiliser le même descripteur de fichier donc il devrait y avoir aucun problème avec mise en mémoire tampon. Je suis en utilisant gcc 3.4.6 sur Solaris 10.

#include <errno.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int fd[2];
    int pid;
    char buf[256];
    int n;

    if(pipe(fd) < 0) {
        perror("pipe");
        return 1;
    }
    if((pid = fork()) < 0) {
        perror("fork");
        return 1;
    }
    else if(pid > 0) { //parent
        close(fd[1]);
        if((n = read(fd[0], buf, sizeof(buf))) > 0) {
            buf[n] = 0;
            printf("%s", buf);
        }
    }
    else {
        dup2(fd[1], fileno(stdout));
        dup2(fd[1], fileno(stderr));
        close(fd[1]);
        fprintf(stdout,"stdout\n");
        fprintf(stderr,"stderr\n");
    }
    return 0;
}

OriginalL'auteur Doug Masterson | 2010-10-19