wwxxlld
wwxxlld
采纳率100%
2019-09-04 18:29

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

5
  • c++
  • c语言
已采纳

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

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

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • wwxxlld wwxxlld 2年前

    问题已解决,解决方案如下:
    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;
    
    }
    
    点赞 评论 复制链接分享
  • phenix2009 白色一大坨 2年前

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

    点赞 1 评论 复制链接分享
  • weixin_42177642 weixin_42177642 2年前

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

    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2年前
    点赞 评论 复制链接分享