我想调用bar()
,foo()
会bar()
改变一些全局变量的值(这是我想要的),但同时产生一些输出(我不想要任何输出);
void foo()
{
//I have tried:
//system("1>&/dev/null") and of course this won't work
bar();
}
我能做些什么来抑制bar()
的输出?
可以先保存全局变量,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)在将标准输出切换回控制台(或管道)之前打印的任何内容都不会打印。