Frank
Frank

Reputation: 19352

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

Within my C program, I’d like to temporarly redirect stdout to /dev/null (for example). Then, after writing to /dev/null, I’d like to restore stdout. How do I manage this?

Upvotes: 30

Views: 21549

Answers (1)

R.. GitHub STOP HELPING ICE
R.. GitHub STOP HELPING ICE

Reputation: 215193

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 *).

Upvotes: 59

Related Questions