C标准替代方案
我正在使用一个库来完成我的项目。这个库有时会将一些消息打印到标准输出。这对我来说是个问题,因为消息与应用程序消息混合在一起。停止这种行为或将其打印到其他窗口将非常有用。我正在使用C语言和Mingw32环境。我该怎么做?谢谢。您可以(不方便地)用另一个流交换C标准替代方案,c,mingw,stdout,C,Mingw,Stdout,我正在使用一个库来完成我的项目。这个库有时会将一些消息打印到标准输出。这对我来说是个问题,因为消息与应用程序消息混合在一起。停止这种行为或将其打印到其他窗口将非常有用。我正在使用C语言和Mingw32环境。我该怎么做?谢谢。您可以(不方便地)用另一个流交换stdout: #include <stdio.h> FILE *devnull; #define SWAPSTDOUT() do{ FILE *tmp = stdout; stdout = devnull; devnull =
stdout
:
#include <stdio.h>
FILE *devnull;
#define SWAPSTDOUT() do{ FILE *tmp = stdout; stdout = devnull; devnull = tmp; }while(0)
int main(void)
{
/*program initialization*/
if(0==(devnull= fopen("/dev/null", "r"))) return 1;
fputs("your code 0\n",stdout);
SWAPSTDOUT();
fputs("library code 0\n",stdout); //should be silent
SWAPSTDOUT();
fputs("your code 1\n", stdout);
}
这两种解决方案都取决于您的代码是单线程的
在任何情况下,行为良好的库函数都应该保留它们不拥有的文件,除非您明确要求它们对这些文件执行某些操作。库函数通常不应该写入到
stdout
,除非这是函数的目的。您确定它没有写入stdout吗?在这种情况下,库写入stdout是因为如果我插入“fclose(stderr)”什么都没有发生,否则我关闭stdout,屏幕是干净的。您的应用程序是单线程的,并且保证只有单线程的吗?如果是这样的话,就可以用重定向stdout
到其他目的地的调用来包装对这个异常库的所有调用,调用库,然后还原stdout
。如果您的应用程序或库是多线程的,那么没有安全的方法可以做到这一点。
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int devnull, tmp;
int swapstdout(void);
int main(void)
{
/*program initialization*/
if(0>(devnull=open("/dev/null", O_RDONLY))) return EXIT_FAILURE;
if(0>(tmp=dup(devnull))) return EXIT_FAILURE; //reserve a fd spot
fputs("your code 0\n",stdout);
if(0>swapstdout()) return EXIT_FAILURE:
fputs("library code 0\n",stdout); //should be silent
if(0>swapstdout()) return EXIT_FAILURE:
fputs("your code 1\n", stdout);
}
int swapstdout(void)
{
if(0>fflush(stdout)) return -1;
if(0>dup2(STDOUT_FILENO,tmp)) return -1; /*really shouldn't happen*/
if(0>dup2(devnull,STDOUT_FILENO)) return -1; /*really shouldn't happen*/
if(0>tmp=dup(devnull)) return -1; /*really shouldn't happen unless we're multithreaded and another thread steals the fd spot*/
}