当前位置: 首页 > 面试题库 >

禁止从链接库输出到cout

松桐
2023-03-14
问题内容

我需要针对其产生太多输出到一对夫妇共享库链接到我的C 程序 std::cout,并 std::cerr使得它们既没有用我的用途。我可以访问这些库的C

源代码,但无法对其进行修改。

当与我的代码链接时,是否可以将其输出重定向到其他流或取消显示?我希望使用C
++的简洁方式,但是由于担心那是不可能的,我也会对肮脏的链接程序黑客感到满意。libstdc++作为最后的手段,“代理”也可以。

我使用的是GNU工具链(工作g++libtoolldLinux下)。


问题答案:

好吧,似乎没人受到打击,这是我的链接器建议:

  1. 插入libc,提供自己的内容write(),并将输出过滤到文件描述符12
  2. 将您自己的代码与libc静态链接,然后write()如上所述将共享版本插入静噪。
  3. 插入libc,提供my_write()绕过write()using 的功能dlsym()
  4. write通过链接链接共享库时自动换行-Wl,--wrap=write。然后,将所有输出压缩到文件描述符中,12使用一个称为的函数__wrap_write。其他文件描述符应通过调用__real_write

请注意,对于那些不知道的文件描述符1,它们2对应于stdoutstderr,并且最终写入到cout/
cerr机器中。通常,这是实现的cout调用fwrite,这些调用write在不同级别具有不同级别的缓冲和恶作剧。

最好的选择是选项4,缺点是您必须调整共享库的最终链接。

下一个最好的选择是上面的选项2,缺点是最终的可执行文件要大得多,但是不必在您自己的代码中使用愚蠢的函数。



 类似资料:
  • 问题内容: 如何停止subprocess.Popen的输出?如果打印量很大,有时打印速度可能会很慢。 问题答案: 如果要完全丢弃它: 如果您使用的是Python 2.5,则将需要使用,或者只是不使用。

  • 问题内容: 使用机器学习库PyML时遇到一个烦人的问题。PyML使用libsvm来训练SVM分类器。问题是libsvm将一些文本输出到标准输出。但是因为那是在Python之外,所以我无法拦截它。我尝试使用问题Python中描述的方法使函数的标准输出静音,而不破坏sys.stdout并恢复每个函数调用, restori)但这些方法均无济于事。 有什么办法可以做到这一点。不能修改PyML。 问题答案:

  • 在从sping-引导1.5. x切换到sping-引导-2. x后,当db连接关闭时,我的Spring应用程序会不断尝试重新连接到数据库。我甚至无法调用运行状况检查endpoint。 这只发生在spring-boot-2.x中 它可能会尝试重新连接,但就我而言,它不应该阻止整个应用程序。 application.yml pom.xml 当数据库关闭时,我得到以下错误的泛滥。 错误

  • 问题内容: 如果你碰巧有 在程序(或模块)的中间,您将得到警告: 我理解为什么通常不鼓励这样做(命名空间不可见),但是在很多情况下,这样做很方便,尤其是在不与任何人共享代码的情况下。 那么,谁能准确地详细解释为什么在所有可能的情况下都应禁止这样做? 问题答案: 我相信通过“在您的程序中间”,您正在谈论函数定义 内 的导入: 不允许这样做,因为这会使优化函数主体过于困难。Python实现希望在对函数

  • 我有一个传统的Java应用程序,它使用Log4j作为日志工具。该应用程序缺少度量,所以我想找到一种方法,智能地检索一些基于java类的度量。 问题是我想在服务之前拦截所有log4j日志。 这个想法的灵感来自于系统的链接。看起来像这样 那么有没有一种方法来链接Log4j输出流并在java上完全控制它,因为我需要在登录前做一些逻辑。 谢谢

  • 问题内容: 我让库的其余部分完全正常工作,只是试图生成api键,并通过ajax执行时禁止抛出403。 我跟踪到REST_Controller下的_remap函数..好像我不正确地调用url一样? 工作流程: 他们注册一个帐户后,单击“生成密钥”后,将在site1.com上使用以下表格。 ajax呼叫: GitHub上的REST-SERVER:https : //github.com/philstu