C标准替代方案

C标准替代方案,c,mingw,stdout,C,Mingw,Stdout,我正在使用一个库来完成我的项目。这个库有时会将一些消息打印到标准输出。这对我来说是个问题,因为消息与应用程序消息混合在一起。停止这种行为或将其打印到其他窗口将非常有用。我正在使用C语言和Mingw32环境。我该怎么做?谢谢。您可以(不方便地)用另一个流交换stdout: #include <stdio.h> FILE *devnull; #define SWAPSTDOUT() do{ FILE *tmp = stdout; stdout = devnull; devnull =

我正在使用一个库来完成我的项目。这个库有时会将一些消息打印到标准输出。这对我来说是个问题,因为消息与应用程序消息混合在一起。停止这种行为或将其打印到其他窗口将非常有用。我正在使用C语言和Mingw32环境。我该怎么做?谢谢。

您可以(不方便地)用另一个流交换
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*/
}