在调用一个写于Fortran的外部库中的嘈杂函数之前,我使用以下代码来重定向标准输出:
// 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);
总结以上代码片段的意图:复制标准输出,关闭标准输出(释放文件描述符0),打开文件(使用最低的文件描述符=0=stdout),使用重定向的标准输出运行代码,并重置标准输出。
当我在终端上使用标准输出时,这个方法能完美地运行我的代码。然而,当我将标准输出设置为一个文件(使用$ mycode > myfile.txt命令)时,重定向失败了,导致我在myfile.txt中看到的是func()函数的输出,而不是日志文件的输出。这是怎么回事呢?
fwrite()
相同的缓冲区。另外,C运行时或您的辅助库在您的C代码尝试写入stdout时也有可能刷新Fortran的缓冲区。 - Kevinfflush(stdout)
吗? - JS1STDOUT_FILENO
等于 1。你的程序可能在关闭标准输入的情况下运行。 - fuz