Unix-C - Umleiten von stdout an Rohr und dann wieder auf stdout
Ich bin mir nicht sicher, ob das folgende getan werden kann, weil ich nicht finden können, Fragen/Ergebnisse über Google auf es. Ich möchte das ändern stdout von einem fork() auf ein Rohr, und dann ändern Sie es zurück zu den normalen stdout.
Dies ist, was ich habe:
FirstExecutable:
int main()
{
int fd[2]; //Used for pipe
int processID;
if(pipe(fd) == -1)
{
printf("Error - Pipe error.\n");
exit(EXIT_FAILURE);
}
if((processID = fork()) == -1)
{
fprintf(stderr, "fork failure");
exit(EXIT_FAILURE);
}
if(processID == 0)
{
int newFD = dup(STDOUT_FILENO);
char newFileDescriptor[2];
sprintf(newFileDescriptor, "%d", newFD);
dup2 (fd[1], STDOUT_FILENO);
close(fd[0]);
execl("./helloworld", "helloworld", newFileDescriptor, NULL);
}
else
{
close(fd[1]);
char c[10];
int r = read(fd[0],c, sizeof(char) * 10);
if(r > 0)
printf("PIPE INPUT = %s", c);
}
}
helloworld
int main(int argc, char **argv)
{
int oldFD = atoi(argv[1]);
printf("hello\n"); //This should go to pipe
dup2(oldFD, STDOUT_FILENO);
printf("world\n"); //This should go to stdout
}
Gewünschte Ausgabe:
world
PIPE OUTPUT = hello
Aktuelle Ausgabe:
hello
world
man perror
Verwenden Sie nichtfprintf
zu drucken Fehlermeldungen ohnestrerror
- Danke für den Tipp!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen
zu
Das Problem hier ist die Pufferung. Aus Gründen der Effizienz DATEI-handles nicht immer sofort ausgeben, wenn geschrieben. Stattdessen reichern Sie sich den text in einen internen Puffer.
Gibt es drei Pufferung Modi, Ungepuffert, line-gepuffert, block-gepuffert. Ungepuffert Griffe immer sofort schreiben (stderr ist Ungepuffert). Line-buffered-Griffe warten, bis der Puffer voll ist oder ein Zeilenumbruch (
'\n'
) ist gedruckt (stdout ist line buffered, wenn es bezieht sich auf ein terminal geht). Block-gepuffert verarbeitet warten Sie, bis der Puffer voll ist (stdout ist block buffered, wenn es bezieht sich nicht auf ein terminal geht).Wenn Ihr helloworld-Programm wird gestartet, stdout geht ein Rohr, kein terminal, es ist also als block-gepuffert. Die printf fordert daher, einfach speichern Sie den text im Speicher. Da der Puffer nicht voll ist, es wird nur geleert, wenn stdout geschlossen ist, was in diesem Fall passiert, wenn das Programm beendet wird.
Aber durch die Zeit, die das Programm beendet, Datei-Deskriptor 1 (stdout) wurde restauriert und verweisen auf die übergeordnete ursprünglichen stdout, nicht das Rohr. So ist die gepufferte Ausgabe enden, die oben geschrieben werden die ursprünglichen stdout.
fflush
Kräfte die gepufferte text geschrieben werden, sofort.