Lorsque ce programme est exécuté, la ligne "stderr" est affichée avant la ligne "stdout". Pourquoi? Je pensais que dup2 ferait que stderr et stdout utilisent le même descripteur de fichier, donc il ne devrait pas y avoir de problème avec la mise en mémoire tampon. J'utilise gcc 3.4.6 sur Solaris 10.Problème avec dup2, stdout et stderr
#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;
}
Oui, je sais comment résoudre le problème. Je ne comprends tout simplement pas le comportement. Si stdout et stderr utilisent le même descripteur de fichier, je pense que la mise en mémoire tampon ne devrait pas poser de problème. –
Je ne pense pas qu'il existe de norme précise à ce sujet .. Je veux dire que le noyau OS va gérer les choses en interne comme il le souhaite de toute façon .. – Jack