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

标签 c++ cross-platform stdout stderr

我如何被动地监听 stderr 并将其作为字符串获取以发送给回调?我看过有关阅读 stderr 的帖子,但我想听听而不是主动阅读。

背景: 我有一个使用第 3 方库 (libcurl) 的跨平台作品,它将详细信息输出到 stderr。这个跨平台部分将被 1 个以上的非跨平台应用程序使用。

我想记录这些信息,我可以通过向 libcurl 提供 FILE* 来实现。但我不想这样做,而是想看看我是否可以捕获(被动监听)stderr 中的输出作为字符串,并通过回调发送回调用主应用程序。这样做的好处是 1. 主应用程序可以使用它想要的任何日志记录工具来保存单个日志。 2. 它将保持这篇文章的跨平台性。

最佳答案

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

  • 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);
}

关于c++ - 如何在 C/C++ 中监听 stderr 以发送回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13533655/

相关文章:

.net - C++ 代码访问 UniVerse 数据库记录的方法?

c++ - 为 C 库创建 Haxe hxcpp 包装器

android - 将 iPhone/iPad 应用程序转换为 Android

powershell - 将 stdout 和 stderr 重定向到单独的文件时抑制 NativeCommandError 输出

c++ - 记录标准输入和标准输出

c++ - 有没有更清洁的方法来做到这一点? (在 Qt C++ 中准备 SQL 查询)

c++ - 如何在 sleep 时唤醒 std::thread

java - 如何使用Java获取独立于操作系统的系统用户文档、图片、音乐文件夹?

c++ - 跨平台 Windows/OS X 开发,具有大量现有代码库

compilation - 编译 'hello, world' GNU smalltalk