2

我正在尝试编译原始 Crowther/Woods FORTRAN Colossal Cave Adventure 的 1991 C 端口。代码是一个可怕的混乱,但在更改它的某些部分后,它可以正常编译和运行。

问题是当我尝试将其输出通过管道传输到另一个程序或文件时,什么都没有显示。./adventure工作正常,但./adventure | cat不打印任何东西。Grepping 打电话给fstat什么都没有。

程序是否可以通过其他方式检测管道并进入静音模式?即使添加printf("Hello World");为 main 函数的第一行也不会导致任何内容通过 cat 出现。

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

4

2 回答 2

3

正如现有评论所说,stdout 可能是块缓冲的,因为它不再向终端开放。尝试添加调用:

setvbuf(stdout, NULL, _IOLBF, 0);

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

于 2014-01-24T18:07:30.120 回答
1

除了更改程序之外,在 Linux 上,您还可以尝试从命令行使用更改缓冲区模式stdbuf(尽管显然setvbuf应用程序中的任何调用都会覆盖这一点)。例如,您可以尝试:

stdbuf -oL ./adventure | cat

unbuffer(带有expect)和也可以达到类似的效果script

于 2014-01-24T19:22:12.563 回答