在使用Fortran编写的外部库调用嘈杂函数之前,我使用以下代码重定向stdout:
// copy standard output
out = dup(STDOUT_FILENO);
// close standard output
close(STDOUT_FILENO);
// use log file as standard output
log = open(log_file, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
if(log != STDOUT_FILENO)
fprintf(stderr, "could not create log file %s", log_file);
// call the library function that uses a lot of printf
func();
// restore original standard output
dup2(out, STDOUT_FILENO);
// close copy of standard output
close(out);
总结我对上面代码片段的意图:复制stdout,关闭stdout(释放文件描述符0),打开文件(使用最低文件描述符= 0 = stdout),运行带有重定向标准输出的代码,然后重置标准输出。
当我使用终端作为stdout运行我的代码时,这非常有效。但是,当我将stdout设置为文件(使用$ mycode > myfile.txt
)时,重定向失败,我最终在func()
中输出myfile.txt
而不是日志文件。这怎么可能?
答案 0 :(得分:3)
在使用fflush(stdout)
恢复原始标准输出之前,您需要执行dup2
。
它与终端一起工作的原因是因为stdout是终端的线路缓冲。因此,您的输出会立即刷新到重定向的文件。但是当您使用stdout将文件启动到文件时,stdout将完全缓冲,因此您的func
输出将位于缓冲区中,等待刷新。在没有刷新的情况下恢复原始标准输出时,输出会在程序退出时写入原始标准输出。