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
Vous devez vous connecter pour publier un commentaire.
Il y a une différence entre le
FILE *
s stdout et stderr et les descripteurs 1 et 2. Dans ce cas, les Fichiers qui sont à l'origine du comportement que vous n'attendiez pas.stderr
n'est pas tamponnée par défaut, de sorte que, dans le cas d'une erreur, vous pouvez imprimer le message dans la plupart de manière fiable, même si le rendement de cette impression, qui ralentit les performances globales du programme.stdout
, par défaut, est mis en mémoire tampon. Cela signifie qu'il a un tableau de la mémoire qui stocke les données que vous lui avez dit à écrire. Il attend jusqu'à ce qu'il a de la matrice (tampon) rempli d'un certain niveau ou (si c'est l'installation de la ligne de mise en mémoire tampon, c'est souvent le cas) jusqu'à ce qu'il voit un'\n'
. Vous pourriez l'appelerfflush(stdout);
pour le faire aller de l'avant et de les imprimer, mais.Vous pouvez modifier la mise en mémoire tampon des paramètres de
FILE *
.man 3 setbuf
a les fonctions qui font cela pour vous.Dans votre exemple, le
stdout
tampon a été la tenue de la chaîne "stdout" tandis que le "stderr" a été écrit à l'écran. Puis à la sortie du programme de l'openFILE *
sont vidées, donc "stdout" puis imprimé.OriginalL'auteur nategoose
Les deux flux stdout et stderr peut-être en utilisant le même descripteur de fichier, mais avant d'un FICHIER de flux d'écriture des données sous-jacentes du descripteur de fichier, les données sont stockées dans le flux de la mémoire tampon. Les tampons dans stdout et stderr ne deviennent pas la même, juste parce que les deux flux sont connectés à la même descripteur de fichier.
Noter que cette mise en mémoire tampon, est réalisée par le flux de FICHIERS dans le stdio bibliothèque, non pas par le noyau du système d'exploitation et ses descripteurs de fichiers. Il y a peut être d'autres de mise en mémoire tampon se passe là-bas aussi, mais ce problème est causé par la stdio bibliothèque de niveau au-dessus.
OriginalL'auteur Thomas Padron-McCarthy
Ce sujet rinçage stdout?
(juste essayé et ça marche)
Je ne pense pas que les précis de la norme à ce sujet.. je veux dire que le noyau de système d'exploitation va gérer les choses en interne comme il veut de toute façon..
OriginalL'auteur Jack