wwxxlld 2019-09-04 18:29 采纳率: 100%
浏览 1495
已采纳

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

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

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

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

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

  • 写回答

4条回答

  • wwxxlld 2019-09-16 11:27
    关注

    问题已解决,解决方案如下:
    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;
    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥88 实在没有想法,需要个思路
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)