在单个进程中执行此操作有点棘手,但您可能可以做到。
1:使用 freopen() 你可以将你的标准错误重定向到一个命名文件。您可以同时打开该文件以在另一个句柄上读取。您可能还需要在 stderr 上调用 setvbuf() 以关闭输出到 stderr 的缓冲,以便您能够立即从第二个句柄读取它。由于它正在被写入文件,因此您可以在任何时候阅读它——在方便的时候。如果您想在文件更改时收到通知,则需要使用 unix 函数“选择”。(另见 fileno())。
2:更棘手的是将 stderr 设置为管道的写入端。使用 dup3() 应该是可行的,尽管这不完全是跨平台的(对于非 unixy 操作系统)。它还需要第二个线程从管道中读取,以防止写入器在写入量很大时被阻塞。
像:
FILE *stream = freopen("stderr.out", "w", stderr); // Added missing pointer
setvbuf(stream, 0, _IONBF, 0); // No Buffering
FILE *input = fopen("stderr.out", "r");
fprintf(stderr, "Output to stderr dude\n");
//fflush(stderr); // You can explicitly flush instead of setting no buffering.
char buffer[1024];
while (fgets(buffer, 512, input))
{
printf(">>>%s\n", buffer);
}