如何在C/C++中监听stderr以发送回调?

M W*_*M W 5 c++ cross-platform stdout stderr

如何被动地监听stderr并将其作为字符串发送到回调?我看过有关阅读stderr的帖子,但我想听而不是积极阅读它.

背景:我有一个跨平台的部分,使用第三方库(libcurl),它将详细信息输出到stderr.这个跨平台的部分将被超过1个非跨平台的应用程序使用.

我想记录这些信息,我可以通过向libcurl提供FILE*来完成.但是,我想看看我是否可以捕获(被动地监听)stderr中的输出作为字符串,并通过回调发送回调用主应用程序.这有一个好处1.主应用程序可以使用它想要的任何日志记录工具保留单个日志.它会使这件作品跨平台.

joe*_*ing 3

在单个进程中执行此操作有点棘手,但您可能可以做到。

  • 1:使用 freopen() 您可以将 stderr 重定向到指定文件。您可以同时打开该文件以在另一个句柄上读取。您可能还需要在 stderr 上调用 setvbuf() 以关闭对 stderr 输出的缓冲,以便您能够立即从第二个句柄读取它。由于它被写入文件,因此您可以随时读取它 - 当方便时。如果您想在文件更改时收到通知,则需要使用 unix 函数“select”。(另请参见 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);
}
Run Code Online (Sandbox Code Playgroud)