gpt4 book ai didi

c - 通过 freopen() 重定向后恢复标准输出

转载 作者:太空宇宙 更新时间:2023-11-04 05:47:43 25 4
gpt4 key购买 nike

这是 How to capture output of printf? 的后续行动- 特别是 jxh 的回答。

我在 Viesturs 在 2018 年的答案中遇到了同样的问题。有人建议他打开一个新问题,他说他的帐户不允许,所以我打开了一个同样的新问题。

关于那个答案,在 2012 年,最初的提问者说它有效。 2018 年,Viesturs 表示,在运行代码后,控制台和重定向文件中都没有出现进一步的输出。

我遇到了同样的问题。使用下面的代码,this shouldn't be redirected\n 不会显示在控制台上,也不在重定向的文件中。重定向的文件仅包含第一行打印。

我用的是 gcc 8.3.0,也试过 gcc 6.5.0。 glibc 2.29。

请注意,我不想在之后使用"CON" freopen。即使可行,我也想保留原始标准输出,因为它本身可能是重定向。 (虽然在我的测试中,它只是控制台。)

或者: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,因为 stdout 不是变量/左值。它是一个扩展为 FILE * 类型表达式的宏。如果它碰巧也是一个左值,那么它就是它所发生的任何特定实现的实现细节,而不是语言的一部分。
  • fclose(stdout),因为在 fclose(stdout) 之后,在程序中的任何地方进一步使用 stdout 都是隐式的(例如 printf) 或显式,在剩余的执行期间,调用未定义的行为。

一个好的解决方案也不涉及 freopen,尽管您可能 可以实现它。相反,只需使用 dup2fflush。这个答案(我的)解释了如何去做:

https://stackoverflow.com/a/4832902/379897

用您想要指向的文件代替 "/dev/null"

关于c - 通过 freopen() 重定向后恢复标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56097917/

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