我需要针对其产生太多输出到一对夫妇共享库链接到我的C 程序std::cout,并std::cerr使得它们既没有用我的用途。我可以访问这些库的C 源代码,但无法对其进行修改。
std::cout
std::cerr
当与我的代码链接时,是否可以将其输出重定向到其他流或取消显示?我希望使用C ++的简洁方式,但是由于担心那是不可能的,我也会对肮脏的链接程序黑客感到满意。libstdc++作为最后的手段,“代理”也可以。
libstdc++
我使用的是GNU工具链(工作g++,libtool,ldLinux下)。
g++
libtool
ld
好吧,似乎没人受到打击,这是我的链接器建议:
write()
1
2
my_write()
dlsym()
write
-Wl,--wrap=write
__wrap_write
__real_write
请注意,对于那些不知道的文件描述符1,它们2对应于stdout和stderr,并且最终写入到cout/ cerr机器中。通常,这是实现的cout调用fwrite,这些调用write在不同级别具有不同级别的缓冲和恶作剧。
stdout
stderr
cout
cerr
fwrite
最好的选择是选项4,缺点是您必须调整共享库的最终链接。
下一个最好的选择是上面的选项2,缺点是最终的可执行文件要大得多,但是不必在您自己的代码中使用愚蠢的函数。