C程序拒绝管道



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

问题是,当我尝试将其输出输送到另一个程序或文件时,什么都没有出现。./adventure工作正常,但是./adventure | cat没有打印任何东西。格雷普打电话给fstat什么都没出现。

是否有其他方法可以检测到管道并进入静音模式?即使添加printf("Hello World");作为主要功能的第一行也不会导致任何通过CAT出现的内容。

编辑:我正在使用吉姆·吉洛利(Jim Gillogly)的版本,但是我从中获得的链接已经腐烂了。我会找到另一个下载链接。

正如现有评论所说的那样,Stdout可能会被阻止,因为它不再向终端开放。尝试添加呼叫:

setvbuf(stdout, NULL, _IOLBF, 0);

程序开始时的某个地方。这将将Stdout更改为线条缓冲模式,该模式将在程序编写新线后立即冲洗输出。

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

stdbuf -oL ./adventure | cat

unbuffer(带有expect)和script

也可以实现类似的效果。

最新更新