Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序拒绝管道?_C_Gcc_Fortran_Pipe_Adventure - Fatal编程技术网

C程序拒绝管道?

C程序拒绝管道?,c,gcc,fortran,pipe,adventure,C,Gcc,Fortran,Pipe,Adventure,我正在尝试编译Crowther/Woods FORTRAN《巨型洞穴探险》原版的1991年C端口。这段代码乱七八糟,但在更改了其中的某些部分后,它可以正常编译和运行 问题是,当我试图通过管道将其输出传输到另一个程序或文件时,什么也没有显示/冒险很好,但是。/冒险猫不会打印任何东西。打电话到fstat没有结果 程序是否有其他方法检测管道并进入静默模式?甚至添加了printfHello World;因为主函数的第一行不会导致通过cat显示任何内容 编辑:我使用的是吉姆·吉洛格利的版本,但是我从中得到

我正在尝试编译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秒钟。请注意程序写入终端与写入管道时的行为差异。一定要打印换行符。