14

我想调用bar()foo()bar()改变一些全局变量的值(这是我想要的),但同时产生一些输出(我不想要任何输出);

void foo() 
{
    //I have tried:
    //system("1>&/dev/null") and of course this won't work
    bar();
}

我能做些什么来抑制bar()的输出?

4

1 回答 1

18

可以先保存全局变量,stdout然后bar();设置为/dev/null,再恢复。代码示例;

#include <stdio.h>

int main() {
    int old_stdout = dup(1);

    freopen ("/dev/null", "w", stdout); // or "nul" instead of "/dev/null"
    printf("asd1");
    fclose(stdout);

    stdout = fdopen(old_stdout, "w"); 
    printf("asd2");
    return 0;
}

在 OS X 上测试,不确定 Windows。

编辑:您可以在 Windows 上替换/dev/null为。nul至于在 Windowsfdopen()dup()工作 - 根据我的man页面,它们是 POSIX.1 标准的一部分,但我还没有测试过。

编辑 2:正如评论中所建议的,如果该解决方案不适用于 Windows,则此 SO answer中还有另一个建议。

编辑 3:执行此操作的更长但符合标准且跨平台的方法如下。(代码改编自提到的 SO 问题和 Microsoft 的 _dup 文档)

#include <stdio.h>

#ifdef _WIN32
#include <io.h>
char * const nulFileName = "NUL";
#define CROSS_DUP(fd) _dup(fd)
#define CROSS_DUP2(fd, newfd) _dup2(fd, newfd)
#else
#include <unistd.h>
char * const nulFileName = "/dev/null";
#define CROSS_DUP(fd) dup(fd)
#define CROSS_DUP2(fd, newfd) dup2(fd, newfd)
#endif

int main() {
    int stdoutBackupFd;
    FILE *nullOut;
    /* duplicate stdout */
    stdoutBackupFd = CROSS_DUP(STDOUT_FILENO);

    fflush(stdout);
    nullOut = fopen(nulFileName, "w");
    CROSS_DUP2(fileno(nullOut), STDOUT_FILENO);

    printf("asd1\n");
    fflush(stdout);
    fclose(nullOut);

    // Restore stdout
    CROSS_DUP2(stdoutBackupFd, STDOUT_FILENO);
    close(stdoutBackupFd);

    printf("asd2\n");

    return 0;
}

需要刷新以确保(1)在切换标准输出之前打印的任何内容确实打印到屏幕上,以及(2)在将标准输出切换回控制台(或管道)之前打印的任何内容都不会打印。

于 2012-11-21T16:58:23.937 回答