【问题标题】:Shared Library is outputting into stdout共享库正在输出到标准输出
【发布时间】:2016-05-09 17:47:11
【问题描述】:

我正在用 C++ 编写一个必须使用标准输出来输出响应的应用程序(它是一个从 Apache Web 服务器调用的 CGI-BIN 守护进程,Apache 获取二进制文件的标准输出作为响应)。

最大的问题是我使用的是共享库,它也将日志输出到标准输出,这些日志直接发送到 http 客户端,使其无法解析实际的 HTTP 响应。

我的问题是,有什么方法可以抑制来自共享库的输出?

PS:我在 Linux 上运行它并使用 *.so 库

提前致谢

【问题讨论】:

  • 您必须使用任何必要的选项(或代码黑客)来重建库以抑制它们。也就是说,您是否确定该库正在输出到 stdout 而不是 stderr?
  • 是的,我确定库正在输出,它甚至会在日志上打印其名称。嗯,它是第三方库,无法重建。
  • 如果由于某种原因@JesperJuhl 的回答没有帮助,另一种选择可能是将您的 CGI 二进制文件拆分为一个不使用此 .so 的面向 Apache 的一侧,以及一个使用该 .so 的辅助可执行文件;该辅助可执行文件将使用不同的标准输出生成,并具有到主要可执行文件的专用通信通道(然后仅充当中继)。相当丑陋...比追踪第三者并让他们修复损坏的图书馆更丑陋:-)
  • 这是一个什么样的库?也许有更好的替代品?

标签: c++ apache shared-libraries cgi-bin


【解决方案1】:

1) 那是一个糟糕的图书馆。库不应写入标准输出。

2) 您可以通过在 stderr 描述符上复制 stdout 文件描述符然后关闭 stdout 来绕过它。感觉就像一个讨厌的黑客。

【讨论】:

  • 是的,它不是最好的库。您可以为此发布解决方案代码吗?
  • @Diego Tsutsumi :您可以轻松地自己研究。提示 dup(2) 和 close()。
  • 感谢您的提示 :) 。还有一个问题,在系统调用我的主函数之前,库输出了 3 行日志。像“库加载成功”之类的东西,在这种情况下,您的解决方案将不起作用,因为我稍后会调用 dup(2) 和 close()。
  • 您可以强制实例化类,该类会在库之前的类的构造函数中切断库对标准输出的访问。这是一个共享库(.so、.dll)吗?如果是这样,您应该能够根据自己的条件动态加载它。
  • @user4581301:感谢您的评论,我会在我的应用程序启动后尝试加载库,看看会发生什么。 :)
猜你喜欢
  • 2014-12-28
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 2013-05-01
相关资源
最近更新 更多