问题已解决,解决方案如下:
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;
}