【发布时间】:2019-05-12 09:36:49
【问题描述】:
这是How to capture output of printf? 的后续行动——特别是 jxh 的回答。
我在回答 Viesturs 2018 年遇到的问题时遇到了同样的问题。有人建议他打开一个新问题,但他说他的帐户不允许,所以我要打开一个类似的新问题。
关于那个答案,2012 年,最初的提问者说它有效。 Viesturs 在 2018 年表示,代码运行后,控制台和重定向文件中都没有出现进一步的输出。
我也有同样的问题。使用下面的代码,this shouldn't be redirected\n 不会显示在控制台上,也不会出现在重定向文件中。重定向后的文件只包含打印的第一行。
我使用的是 gcc 8.3.0,也尝试了 gcc 6.5.0。 glibc 2.29.
请注意,我不想在之后使用 freopen 和 "CON"。即使可行,我也想保留原始标准输出,因为它本身可能是重定向。 (虽然在我的测试中,它只是控制台。)
要么:jxh 答案中有一个错误;我犯了与 Viesturs 相同的错误;或者(我的最佳猜测)在 gcc 6.5.0 或 glibc 2.29 之前的某个时间引入(或修复)了一个错误。
redirected.c
#include <unistd.h>
#include <stdio.h>
void funcB() {
printf("this should be redirected\n");
fflush(stdout);
}
int main() {
int stdout_fd = dup(STDOUT_FILENO);
freopen("/tmp/redirected", "w", stdout);
funcB();
fclose(stdout);
dup2(stdout_fd, STDOUT_FILENO);
stdout = fdopen(STDOUT_FILENO, "w");
close(stdout_fd);
printf("this shouldn't be redirected\n");
fflush(stdout); // shouldn't make a difference if this is here
}
输出:
$ gcc redirected.c
$ ./a.out
<THERE IS NO OUTPUT>
$ cat /tmp/redirected
this should be redirected
【问题讨论】:
-
我敦促您捕获函数调用的返回值,以检查它们是否存在错误代码。如果您关心它们是否会失败,则必须始终对可能失败的函数执行此操作。
-
stdout 不是您可以像这样分配的变量/左值。这是一个扩展为
FILE *类型表达式的宏。分配给它总是错误的。在 fclose 之后,您将永远无法在整个进程生命周期内再次使用 stdout。