我经历了几个关于std :: cout评估顺序的问题,我知道std :: cout的args之间没有序列点,但是我无法理解以下代码是如何工作的:
saved_fd = dup(STDOUT_FILENO);
std::cout << "Redirecting std out to /dev/null";
redirect_stdout()
<do some stuff>
std::cout << "Restoring std out back to standard output";
restore_stdout();
我的函数redirect_stdout()和restore_stdout(),使用dup2调用将标准输出重定向到/ dev / null并稍后将其恢复。我希望屏幕上显示的唯一输出是“将std out重定向到/ dev / null”。但我所看到的是“恢复标准输出”。
似乎redirect_stdout()在前一个语句之前运行。
为了完整起见,以下是两种方法的定义:
void redirect_stdout()
{
dump_fd = open("/dev/null", O_RDWR, 0777);
dup2(dump_fd, STDOUT_FILENO);
cout << endl;
}
void restore_stdout()
{
dup2(saved_fd, STDOUT_FILENO);
cout << endl;
}
为什么我看不到第一个cout输出?
答案 0 :(得分:1)
在这两种情况下,答案都是“缓冲”。将输出发送到cout
时,在缓冲区已满或直到刷新输出之前,它不会发送到文件描述符1。
修复是刷新输出:
saved_fd = dup(STDOUT_FILENO);
std::cout << "Redirecting std out to /dev/null" << std::flush;
redirect_stdout()
<do some stuff>
std::cout << "Restoring std out back to standard output" << std::flush;
restore_stdout();
(而不是std::flush
,您还可以使用std::endl
输出换行符并刷新输出。)