How could I temporary redirect stdout to a file in a C program?

On POSIX systems, you can do it as follows:

int bak, new;

fflush(stdout);
bak = dup(1);
new = open("/dev/null", O_WRONLY);
dup2(new, 1);
close(new);

/* your code here ... */

fflush(stdout);
dup2(bak, 1);
close(bak);

What you want is not possible in further generality.

Any solution using freopen is wrong, as it does not allow you to restore the original stdout. Any solution by assignment to stdout is wrong, as stdout is not an lvalue (it’s a macro that expands to an expression of type FILE *).

Leave a Comment