Quello che voglio farereindirizzamento output/error al file sotto Unix C++ - ancora una volta
reindirizzamento stdout e stderr di uno o più file da dentro C++
Perché ne ho bisogno
Sto usando una libreria esterna di terze parti precompilata che produce una quantità ridicola di output, che vorrei reindirizzare su un file di log per mantenere pulita la console.
Condizioni
compatibilità non è un problema, il codice verrà eseguito solo su sistemi Unix. Il reindirizzamento non dovrebbe riguardare solo la stampa in stile C++ (std :: cout < < "ciao mondo" < < std :: endl), ma anche la stampa in stile c (printf ("ciao mondo \ n")).
Quello che ho provato finora
Sono stato navigando su StackOverflow per mezza giornata, la lettura di molteplici risposte alle persone che hanno problemi simili. Con l'aiuto di queste risposte, sono stato in grado di mettere insieme il seguente pezzo di codice:
#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;
}
Quello che mi sarei aspettato di vedere:
visible 1
visible 2
Quello che in realtà vedi
visible 1
Cioè, quando si utilizza questo meccanismo per la prima volta, funziona - ma se usato di nuovo, il ripristino dell'output non funzionerà. Qualcuno può indicarmi cosa devo cambiare per far funzionare il meccanismo infinitamente spesso?
Eventuali duplicati: http://stackoverflow.com/questions/4810516/c-redirecting-stdout – Kelm