在从用 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。
当我使用终端作为标准输出运行代码时,这非常有效。但是,当我将 stdout 设置为文件时(使用$ mycode > myfile.txt
)重定向失败,我最终得到的输出func()
in myfile.txt
而不是日志文件。这怎么可能?
你需要做fflush(stdout)
在恢复原始标准输出之前dup2
.
它与终端一起使用的原因是因为 stdout 是为终端进行行缓冲的。因此您的输出会立即刷新到重定向文件。但是,当您使用文件的标准输出启动程序时,标准输出将完全缓冲,因此您的func
输出将在缓冲区中等待刷新。当您恢复原始标准输出而不刷新时,程序退出时输出将写入原始标准输出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)