Probleme mit dup2, stdout und stderr
Wenn dieses Programm ausgeführt wird, das "stderr" Zeile angezeigt wird, bevor die "stdout" - Linie. Warum? Ich dachte, dup2 machen würde, stderr und stdout verwenden Sie die gleiche Datei-Deskriptor, so sollte es kein problem mit der Pufferung. Ich bin mit gcc 3.4.6 auf 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;
}
InformationsquelleAutor Doug Masterson | 2010-10-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einen Unterschied zwischen den
FILE *
s stdout und stderr und die Datei-Deskriptoren 1 und 2. In diesem Fall ist es die Dateien, die das Verhalten verursacht, dass du nicht erwartet hast.stderr
ist nicht gepuffert Standard, so dass im Fall eines Fehlers können Sie drucken Sie die Nachricht in die zuverlässigste Art und Weise, obwohl die Leistung dieser Druck verlangsamt die Gesamtleistung des Programms.stdout
ist standardmäßig gepuffert. Dies bedeutet, dass es ist ein array von Speicher, ist es die Speicherung der Daten, die Sie gesagt haben, es zu schreiben. Es wartet, bis es die array (sogenannte Puffer) gefüllt, um eine bestimmte Stufe oder (wenn es setup für Zeile Pufferung, was es oft ist), bis er sieht, eine'\n'
. Man könntefflush(stdout);
zu machen, gehen Sie vor und drucken, obwohl.Ändern Sie können die Pufferung der Einstellungen von
FILE *
.man 3 setbuf
hat die Funktionen, die dies für Sie tun.In deinem Beispiel die
stdout
Puffer hielt die Zeichenfolge "stdout", während die "stderr" wurde auf den Bildschirm geschrieben. Dann wird beim beenden des Programms alle offenenFILE *
gespült werden, so "stdout" dann gedruckt.InformationsquelleAutor nategoose
Den beiden streams stdout und stderr kann mit der gleichen Datei-Deskriptor, aber vor ein stream-DATEI schreibt keine Daten auf die zugrunde liegende Datei-Deskriptor ist, werden die Daten in den stream-Puffer. Der Puffer wird in stdout und stderr nicht gleich werden, nur weil die beiden Ströme sind mit dem gleichen Datei-Deskriptor.
Beachten Sie, dass diese Pufferung wird gemacht, indem die DATEI-streams in der stdio-Bibliothek, nicht von der OS kernel und die Datei-Deskriptoren. Es können auch andere Pufferung geht es auch, aber dieses problem wird verursacht, durch die stdio-Bibliothek, Ebene oben.
InformationsquelleAutor Thomas Padron-McCarthy
Was über flushing stdout?
(gerade versucht und es funktioniert)
Ich glaube nicht, dass es keine genauen standard über das.. ich meine das der OS kernel behandelt Dinge, die intern, wie es will ja sowieso..
InformationsquelleAutor Jack