C程序拒绝管道?
我正在尝试编译Crowther/Woods FORTRAN《巨型洞穴探险》原版的1991年C端口。这段代码乱七八糟,但在更改了其中的某些部分后,它可以正常编译和运行 问题是,当我试图通过管道将其输出传输到另一个程序或文件时,什么也没有显示/冒险很好,但是。/冒险猫不会打印任何东西。打电话到fstat没有结果 程序是否有其他方法检测管道并进入静默模式?甚至添加了printfHello World;因为主函数的第一行不会导致通过cat显示任何内容C程序拒绝管道?,c,gcc,fortran,pipe,adventure,C,Gcc,Fortran,Pipe,Adventure,我正在尝试编译Crowther/Woods FORTRAN《巨型洞穴探险》原版的1991年C端口。这段代码乱七八糟,但在更改了其中的某些部分后,它可以正常编译和运行 问题是,当我试图通过管道将其输出传输到另一个程序或文件时,什么也没有显示/冒险很好,但是。/冒险猫不会打印任何东西。打电话到fstat没有结果 程序是否有其他方法检测管道并进入静默模式?甚至添加了printfHello World;因为主函数的第一行不会导致通过cat显示任何内容 编辑:我使用的是吉姆·吉洛格利的版本,但是我从中得到
编辑:我使用的是吉姆·吉洛格利的版本,但是我从中得到的链接已经坏掉了。我会为它找到另一个下载链接。正如现有评论所说,stdout可能是块缓冲的,因为它不再向终端打开。尝试添加呼叫:
setvbuf(stdout, NULL, _IOLBF, 0);
在节目开始的时候。这将把stdout更改为行缓冲模式,一旦程序写入换行符,就会刷新输出。正如现有注释所述,stdout可能是块缓冲的,因为它不再向终端打开。尝试添加呼叫:
setvbuf(stdout, NULL, _IOLBF, 0);
在节目开始的时候。这会将stdout更改为行缓冲模式,这将在程序写入换行符后立即刷新输出。在Linux上,您也可以使用stdbuf从命令行尝试更改缓冲模式,而不是更改程序,尽管应用程序中的任何setvbuf调用都会覆盖此模式。例如,您可以尝试:
stdbuf -oL ./adventure | cat
expect和script附带的unbuffer也可以实现类似的效果。在Linux上,您也可以使用stdbuf从命令行尝试更改缓冲区模式,而不是更改程序,尽管应用程序中的任何setvbuf调用显然都会覆盖该模式。例如,您可以尝试:
stdbuf -oL ./adventure | cat
expect和script附带的unbuffer也可以实现类似的效果。它可能不会进入静默模式。当stdout是tty时,默认情况下它是行缓冲的。当它是管道时,它是块缓冲的。您的数据可能只是位于管道缓冲区中。若要在更简单的程序中查看此行为,请编写一个hello world程序,打印“hello world\n”,然后进入睡眠状态10秒钟。请注意程序写入终端与写入管道时的行为差异。确保打印新行。它可能没有进入静默模式。当stdout是tty时,默认情况下它是行缓冲的。当它是管道时,它是块缓冲的。您的数据可能只是位于管道缓冲区中。若要在更简单的程序中查看此行为,请编写一个hello world程序,打印“hello world\n”,然后进入睡眠状态10秒钟。请注意程序写入终端与写入管道时的行为差异。一定要打印换行符。