【问题标题】:How to listen to stderr in C/C++ for sending to callback?如何在 C/C++ 中收听 stderr 以发送到回调?
【发布时间】:2013-09-11 08:03:54
【问题描述】:

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

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

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

【问题讨论】:

  • C++。但我很少使用 std(因为我不确定它是否足够跨平台)。
  • 我不清楚你在做什么。您有一个 C/C++ 程序,它正在链接到正在写入 stderr 的第 3 方库 - 所有这些都在一个进程中 - 您想以编程方式捕获该输出?

标签: c++ cross-platform stdout stderr


【解决方案1】:

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

  • 1:使用 freopen() 您可以将 stderr 重定向到指定文件。您可以同时打开该文件以在另一个句柄上读取。您可能还需要在 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多