问题:在linux环境下,用c++开发了一个程序,里面调用了挺多公共的静态或者动态库,因为这些库的打印信息较多导致
自己写的程序的打印信息难以发现
需求:只将当前程序内的打印信息输出到终端,程序调用的动、静态库的打印信息不输出到终端
自己的想法:
定义一个文件描述符,置为当前stdout的值(1),自己程序输出则往这个新定义的文件描述符输出,将stdout重定向为其他值,这样是否能实现?如果不能,还能有什么其他思路吗?
当前测试使用的方法是进程序关闭stdout,封装一个输出函数,输出函数功能就是首先打开stdout,输出信息,在关闭stdout,
问题已解决,解决方案如下:
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;
}
可以,参考:https://blog.csdn.net/mycwq/article/details/46554805
我的建议是你的log单独打印到一组文件里面,通过文件来进行查询,这样就可以分开打印信息了,这是很常用的打印log方法。
在调试输出面板右键菜单中去掉部分信息