我正在尝试编译原始Crowther / Woods FORTRAN巨型洞穴冒险的1991 C端口。代码是一个可怕的混乱,但在更改它的某些部分后,它编译并正常运行。
问题是,当我尝试将其输出管道传输到另一个程序或文件时,没有任何显示。 ./adventure
工作正常,但./adventure | cat
不会打印任何内容。对fstat
的调用进行调整没有任何结果。
程序是否可能检测到管道并进入静音模式?即使添加printf("Hello World");
作为主函数的第一行也不会导致通过cat显示任何内容。
答案 0 :(得分:3)
正如现有的评论所说,stdout可能是块缓冲的,因为它不再被打开到终端。尝试添加通话:
setvbuf(stdout, NULL, _IOLBF, 0);
在程序开始的某个地方。这会将stdout更改为行缓冲模式,一旦程序写入换行符就会刷新输出。
答案 1 :(得分:1)
在Linux上,您可以尝试使用stdbuf
从命令行更改缓冲区模式,而不是更改程序(尽管显然应用程序中的任何setvbuf
调用都将覆盖此项)。例如,您可以尝试:
stdbuf -oL ./adventure | cat
使用unbuffer
(expect
)和script
附带也可以达到类似的效果。