I would like to be able to redirect stderr to a C string because I need to use the string in the program I'm writing. I would like to avoid writing to a file (on the hard drive) first then readings the file to get the string. What is the best way to get this done?
Asked
Active
Viewed 7,282 times
3 Answers
15
You could just use setbuf() to change stderr
's buffer:
#include <stdio.h>
int main(void)
{
char buf[BUFSIZ];
setbuf(stderr, buf);
fprintf(stderr, "Hello, world!\n");
printf("%s", buf);
return 0;
}
prints:
Hello, world!
Hello, world!
Note: you should change the buffer before any operation on the stream.

iabdalkader
- 17,009
- 4
- 47
- 74
-
Oh nice! Didn't know you could even do that! Is `BUFSIZ` defined in stdio? – mmtauqir Feb 05 '13 at 20:02
-
@mtahmed yes, there's more info in the man page, you could also set the buffering mode if you use `setvbuf()` – iabdalkader Feb 05 '13 at 20:03
-
Is there a way to get a callback when 'buf' is written to? – user1660675 Feb 05 '13 at 22:14
-
@user1660675 not that I know of, maybe if you use select on the fd not sure. – iabdalkader Feb 05 '13 at 22:16
-
-1 because this is a hack. The buffer used by `setbuf` is for use by the framework only. This works only if (a) you call `setbuf` immediately the `fprintf`, and your string fits entirely in `BUFSIZ` (or maybe even limited to `BUFSIZ/2` if the buffer is used as a ping-pong, depends on dark implementation details of stdio). – Mark Lakata Aug 01 '14 at 21:05
-
I don't think this will work with sub processes, ie. `system("/bin/echo foo > /dev/stderr");`, because you are only changing the buffering for the *stream* interface to stderr, and not the actual `stderr` file descriptor. – Mark Lakata Aug 01 '14 at 21:11
-
How can I prevent fprintf call to be printed out to the console in this example? – Bren Aug 27 '23 at 22:17
2
- Redirect stderr to stdout and pipe to your C program. See How to pipe stderr, and not stdout?
- Read from stdin in your C program, of course.
This is assuming stderr is coming from another program. If you want to capture all stderr output from your program and process, then in a separate thread listen for writes to stderr via fopen("/dev/stderr", "r")
.
-
I'll give this a shot. I am trying to capture stderr from within the program and use it within that same program so, I would use fopen on stderr then redirect to stdout? – user1660675 Feb 05 '13 at 19:55
-1
I gave an solution using C++ to redirect stdout and stderr to a function (called for each line). I know this was tagged as C, but the guts of my solution use the POSIX api.

Community
- 1
- 1

Mark Lakata
- 19,989
- 5
- 106
- 123