【发布时间】:2022-01-31 11:39:49
【问题描述】:
我正在使用 linux manjaro。我有以下代码(cons.c)
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *f=freopen("/dev/null", "a", stdout); //redirect stdout to /dev/null
FILE *g=freopen ("/dev/tty", "a", stdout); // redirect stdout back to console
printf("%p %p\n",f,g);
return 1;
}
我执行了以下操作并得到了预期的结果
[tom@sp4 src]$ gcc -g cons.c -o cons
[tom@sp4 src]$ ./cons
0x7f19897b7520 0x7f19897b7520
当我在底线设置断点并使用 VS Code 交互式调试器进行调试时,g 返回 null 而 printf 什么也不做。
【问题讨论】:
-
void main()不是托管实现上 Cmain()函数的一致签名。main()应该返回int。但是,这不太可能是您的问题的根源。 -
我无法重现您描述的行为。对我来说,你的程序总是打印“0 256 0”,无论是直接运行还是从 gdb 运行,无论是否设置了断点。这是我所期望的。
-
@John Bollinger 谢谢。 int main() 没有任何区别。我在 vs 代码终端中运行它。怀疑这也会有所作为。
-
实际上,在 VS Code 命令窗口中运行它正是可能导致此类问题的类型。尝试打开一个真正的终端窗口,与 VS Code 分开,并在那里运行您的可执行文件。
-
您没有测试您的
freopen()调用的返回值,因此您不知道它们是否成功。未能检查函数调用的返回值通常是一个错误,我怀疑它在这里咬了你。您描述的行为与第二次freopen()调用失败是一致的,并且您在 VS Code 中运行程序这一事实是一个合理的解释。