Was ichUmleitung stdout/stderr unter Unix-C-Datei ++ - wieder
Umleitung stdout und stderr auf eine oder mehrere Dateien aus dem Inneren C++
Warum ich brauche es
tun wollenIch verwende eine externe, vorkompilierte Third-Party-Bibliothek, die eine lächerliche Menge an Ausgaben erzeugt, die ich in eine Protokolldatei umleiten möchte, um die Konsole sauber zu halten.
Bedingungen
Kompatibilität ist kein Problem, nur der Code auf Unix-Systemen laufen. Die Umleitung sollte nicht nur das C++ - Drucken beeinflussen (std :: cout < < "Hallo Welt" < < Std :: Endl), sondern auch c-style Drucken (printf ("Hallo Welt \ n")).
Was ich versucht habe bisher
ich auf Stackoverflow für einen halben Tag Surfen haben, mehrere Antworten auf Menschen mit ähnlichen Problemen zu lesen. Mit Hilfe dieser Antworten, konnte ich das folgende Stück Code zusammen:
#include <stdio.h>
#include <iostream>
#include <fcntl.h>
#include "unistd.h"
const int stdoutfd(dup(fileno(stdout)));
int redirect_stdout(const char* fname){
fflush(stdout);
int newstdout = open(fname, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
dup2(newstdout, fileno(stdout));
close(newstdout);
}
int restore_stdout(){
fflush(stdout);
dup2(stdoutfd, fileno(stdout));
close(stdoutfd);
return stdoutfd;
}
int main(){
redirect_stdout("/dev/null");
std::cout << "invisible 1" << std::endl;
restore_stdout();
std::cout << "visible 1" << std::endl;
redirect_stdout("/dev/null");
std::cout << "invisible 2" << std::endl;
restore_stdout();
std::cout << "visible 2" << std::endl;
return 0;
}
Was ich erwarten würde, um zu sehen:
visible 1
visible 2
Was ich eigentlich siehe
visible 1
Das heißt, wenn Sie dies verwenden Mechanismus zum ersten Mal, es funktioniert - aber wenn es erneut verwendet wird, wird die Wiederherstellung der Ausgabe nicht funktionieren. Kann mir jemand aufzeigen, was ich ändern muss, damit der Mechanismus unendlich oft funktioniert?
Mögliche doppelt: http://stackoverflow.com/questions/4810516/c-redirecting-stdout – Kelm