Umleitungsstandardausgabe in C und dann den Standardausgang zurücksetzen
Frage
Ich versuche, Weiterleitungen in C zu verwenden, um die Eingabe in eine Datei umzuleiten und dann die Standardausgabe wieder auf den Bildschirm zu drucken. Könnte mir jemand sagen, was mit diesem Code los ist?
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char** argv) {
//create file "test" if it doesn't exist and open for writing setting permissions to 777
int file = open("test", O_CREAT | O_WRONLY, 0777);
//create another file handle for output
int current_out = dup(1);
printf("this will be printed to the screen\n");
if(dup2(file, 1) < 0) {
fprintf(stderr, "couldn't redirect output\n");
return 1;
}
printf("this will be printed to the file\n");
if(dup2(current_out, file) < 0) {
fprintf(stderr, "couldn't reset output\n");
return 1;
}
printf("and this will be printed to the screen again\n");
return 0;
}
Lösung
Deine zweite dup2
Anruf ist falsch, ersetzen Sie:
if (dup2(current_out, 1) < 0) {
Andere Tipps
Eine Sache, die Sie tun müssen, bevor dies überhaupt funktioniert, ist, anzurufen fflush(stdout);
Vor dem Umschalten der stdout
Dateideskriptor unter ihm heraus. Was wahrscheinlich passiert, ist, dass die C -Standardbibliothek Ihre Ausgabe puffert und nicht weiß, dass Sie sich darunter um die darunter liegenden Dateideskriptoren verschieben. Die Daten, die Sie verwenden, verwenden Sie printf()
nicht eigentlich An den zugrunde liegenden Dateideskriptor gesendet, bis sein Puffer voll ist (oder Ihr Programm kehrt von main
).
Fügen Sie den Anruf wie diesen ein:
fflush(stdout);
if(dup2(file, 1) < 0) {
bevor beide Anrufe zu dup2()
.
Einfach ersetzen dup2(current_out, file)
mit dup2(current_out, 1)
, und die Dinge sollten besser funktionieren.