【发布时间】:2022-01-19 01:49:32
【问题描述】:
对于暂时silencing output to cout/cerr然后恢复它,什么是与this C++ answer 等效的C?
如何使stderr/stdout静音和恢复?
(需要这个来消除我正在调用的第 3 方库的噪音,并在通话后恢复。)
【问题讨论】:
-
使用
freopen()将他们重定向到/dev/null
对于暂时silencing output to cout/cerr然后恢复它,什么是与this C++ answer 等效的C?
如何使stderr/stdout静音和恢复?
(需要这个来消除我正在调用的第 3 方库的噪音,并在通话后恢复。)
【问题讨论】:
freopen()将他们重定向到/dev/null
这是一个可怕的 hack,但应该可以:
#include <stdio.h>
#include <unistd.h>
int
suppress_stdout(void)
{
fflush(stdout);
int fd = dup(STDOUT_FILENO);
freopen("/dev/null", "w", stdout);
return fd;
}
void
restore_stdout(int fd)
{
fflush(stdout);
dup2(fd, fileno(stdout));
close(fd);
}
int
main(void)
{
puts("visible");
int fd = suppress_stdout();
puts("this is hidden");
restore_stdout(fd);
puts("visible");
}
【讨论】:
close(fd);最后在restore_stdout吗?我制作了一个适用于 Posix 和 Windows here 的版本 - 但由于某种原因,它实际上不适用于 Godbolt...
perror() 调用来跟踪它(这总是应该做的)。第一部分有效,但标准输出永远无效。也不确定程序如何解决这个问题,因为所需的 freopen ("/dev/stdout", "a", stdout); 也失败了 - 只存在读取权限。我猜他们的busybox或他们使用的任何东西都不支持,这个技巧适用于其他环境:wandbox、onlinegdb。
#include <stdio.h>
#ifdef _WIN32
#define NULL_DEVICE "NUL:"
#define TTY_DEVICE "COM1:"
#else
#define NULL_DEVICE "/dev/null"
#define TTY_DEVICE "/dev/tty"
#endif
int main() {
printf("hello!\n");
freopen(NULL_DEVICE, "w", stdout);
freopen(NULL_DEVICE, "w", stderr);
printf("you CAN'T see this stdout\n");
fprintf(stderr, "you CAN'T see this stderr\n");
freopen(TTY_DEVICE, "w", stdout);
freopen(TTY_DEVICE, "w", stderr);
printf("you CAN see this stdout\n");
fprintf(stderr, "you CAN see this stderr\n");
return 0;
}
【讨论】:
stdout/stderr恢复正常? 2) 是否有与操作系统无关的解决方案,而不仅仅是 Linux?