C程序拒绝管道?

时间:2014-01-24 17:39:50

标签: c gcc fortran pipe adventure

我正在尝试编译原始Crowther / Woods FORTRAN巨型洞穴冒险的1991 C端口。代码是一个可怕的混乱,但在更改它的某些部分后,它编译并正常运行。

问题是,当我尝试将其输出管道传输到另一个程序或文件时,没有任何显示。 ./adventure工作正常,但./adventure | cat不会打印任何内容。对fstat的调用进行调整没有任何结果。

程序是否可能检测到管道并进入静音模式?即使添加printf("Hello World");作为主函数的第一行也不会导致通过cat显示任何内容。

编辑:我正在使用Jim Gillogly的版本,但我从源头获取的链接已经烂了。我会找到另一个下载链接。

2 个答案:

答案 0 :(得分:3)

正如现有的评论所说,stdout可能是块缓冲的,因为它不再被打开到终端。尝试添加通话:

setvbuf(stdout, NULL, _IOLBF, 0);

在程序开始的某个地方。这会将stdout更改为行缓冲模式,一旦程序写入换行符就会刷新输出。

答案 1 :(得分:1)

在Linux上,您可以尝试使用stdbuf从命令行更改缓冲区模式,而不是更改程序(尽管显然应用程序中的任何setvbuf调用都将覆盖此项)。例如,您可以尝试:

stdbuf -oL ./adventure | cat

使用unbufferexpect)和script附带也可以达到类似的效果。