c++程序运行时如何屏蔽掉程序调用的动态库或静态库的打印信息,只打印当前程序里的打印信息?

问题:在linux环境下,用c++开发了一个程序,里面调用了挺多公共的静态或者动态库,因为这些库的打印信息较多导致
自己写的程序的打印信息难以发现

需求:只将当前程序内的打印信息输出到终端,程序调用的动、静态库的打印信息不输出到终端

自己的想法:
定义一个文件描述符,置为当前stdout的值(1),自己程序输出则往这个新定义的文件描述符输出,将stdout重定向为其他值,这样是否能实现?如果不能,还能有什么其他思路吗?

当前测试使用的方法是进程序关闭stdout,封装一个输出函数,输出函数功能就是首先打开stdout,输出信息,在关闭stdout,

4个回答

问题已解决,解决方案如下:
1.一个全局的文件描述符用来记录原来的标准输出文件描述符
2.封装俩个函数,功能分别是打开和关闭标准输出文件描述符的函数
3.封装一个输出函数,函数内部调用第二步封装的打开函数,然后输出,接着调用关闭函数
4.main函数逻辑。首先调用第二步封装的关闭函数,接着如需输出信息则调用第三步封装的输出函数,代码如下:

#include<stdio.h>
#include <stdlib.h>
#include<unistd.h>
#include <stdarg.h>

int fd;
void openStdout()
{
    dup2(fd, 1);
}
void closeStdout()
{
    dup2(1,fd);
    close(1);
}

void privatePrint(const char *format, ...)
{
    //打开stdout
    openStdout();
    va_list vl_p;
    char msg_buf[1024] = { 0 };//如传入参数大于1024,会被丢弃大于1024的部分
    va_start(vl_p, format);
    if (vsnprintf(msg_buf, sizeof(msg_buf), format, ap) < 0)
    {
        return;
    }
    va_end(vl_p);
    printf("%s\n", msg_buf);

    //关闭stdout
    closeStdout();

    return;
}

int main(int argc,char * argv[])
{
    //关闭输出
    closeStdout();
    printf("hello world\n");//无法输出

    //如需输出,使用封装函数
    for (int i = 0; i < argc; i++)
    {
        privatePrint("%d  str:%s\n",i, argv[i]);//正常输出
    }
    return 0;

}

我的建议是你的log单独打印到一组文件里面,通过文件来进行查询,这样就可以分开打印信息了,这是很常用的打印log方法。

phenix2009
白色一大坨 回复wwxxlld: 我给你的提议,是最实用的,既然已经有其他控件占用了打印窗口,单独存文件很方便
2 个月之前 回复
wwxxlld
wwxxlld 感谢回答,当前程序有日志记录运行时的异常信息,终端的打印信息主要是用来自测试时观察用的;
3 个月之前 回复

在调试输出面板右键菜单中去掉部分信息

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!