gpt4 book ai didi

c - 如果 stdout 是文件,则 stdout 重定向不起作用

转载 作者:行者123 更新时间:2023-12-01 12:38:31 26 4
gpt4 key购买 nike

在从 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 )时,重定向失败,最终输出 func()myfile.txt而不是日志文件。这怎么可能?

最佳答案

您需要做的fflush(stdout)在使用 dup2 恢复原始标准输出之前.

它与终端一起工作的原因是因为 stdout 为终端进行了线路缓冲。因此,您的输出会立即刷新到重定向文件。但是当你用标准输出启动你的程序到一个文件时,标准输出变成完全缓冲的,所以你的 func输出将在等待刷新的缓冲区中。当您在不刷新的情况下恢复原始标准输出时,输出将在程序退出时写入原始标准输出。

关于c - 如果 stdout 是文件,则 stdout 重定向不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27196939/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com