È possibile salvare la variabile globale stdout
prima del bar();
, quindi impostarla su /dev/null
, quindi ripristinarla. Esempio di codice;
#include <stdio.h>
int main() {
int old_stdout = dup(1);
freopen ("/dev/null", "w", stdout); // or "nul" instead of "/dev/null"
printf("asd1");
fclose(stdout);
stdout = fdopen(old_stdout, "w");
printf("asd2");
return 0;
}
Testato su OS X, non sono sicuro di Windows.
EDIT: È possibile sostituire /dev/null
con nul
su Windows. Per quanto riguarda il fdopen()
e il dup()
che funzionano sotto Windows, fanno parte dello standard POSIX.1 secondo le mie pagine man
, ma non l'ho provato.
MODIFICA 2: Come suggerito nei commenti, se la soluzione non funziona per Windows, c'è un altro suggerimento in this SO answer.
EDIT 3: Un modo più lungo, anche se conforme agli standard e multipiattaforma per fare ciò è il seguente. (Codice adattato da detto SO domanda e la documentazione di Microsoft per _dup)
#include <stdio.h>
#ifdef _WIN32
#include <io.h>
char * const nulFileName = "NUL";
#define CROSS_DUP(fd) _dup(fd)
#define CROSS_DUP2(fd, newfd) _dup2(fd, newfd)
#else
#include <unistd.h>
char * const nulFileName = "/dev/null";
#define CROSS_DUP(fd) dup(fd)
#define CROSS_DUP2(fd, newfd) dup2(fd, newfd)
#endif
int main() {
int stdoutBackupFd;
FILE *nullOut;
/* duplicate stdout */
stdoutBackupFd = CROSS_DUP(STDOUT_FILENO);
fflush(stdout);
nullOut = fopen(nulFileName, "w");
CROSS_DUP2(fileno(nullOut), STDOUT_FILENO);
printf("asd1\n");
fflush(stdout);
fclose(nullOut);
// Restore stdout
CROSS_DUP2(stdoutBackupFd, STDOUT_FILENO);
close(stdoutBackupFd);
printf("asd2\n");
return 0;
}
Le vampate sono tenuti a fare in modo che (1) niente stampato prima di passare stdout è infatti stampato a schermo, e (2) niente che era stampato prima di riportare lo stdout su console (o pipe).
Potrebbe funzionare con sistemi basati su Unix (Linux, Mac OS X). Non funzionerà mai sotto Windows, poiché nei percorsi di file del mondo di Windows come "/ dev/null" non sono possibili. –
Credo che '/ dev/null' sia la parte facile. Vedi la mia modifica. – user1071136
È possibile assegnare 'stdout' come si fa nella chiamata' fdopen'? Lo standard specifica che lo stdout deve essere un 'l-value'? Farebbe meglio a farlo in questo modo: http://stackoverflow.com/a/7664951/922712 – user93353