在Windows 10中的Cygwin中,EOF是什么?

3
我曾在Win8.1上运行Cygwin,当输入程序时,CTRL-Z用于表示EOF。今天我在Win10上安装了Cygwin,并运行了“a.out”。在键入输入数据后,当我按下CTRL-Z时,会出现“Suspended”消息,并返回shell提示符。我尝试过bash和csh,结果相同。CTRL-D也不起作用,它会终止shell。
只是为了确认这只是问题而已,我创建了一个新的input.txt文件,并在其中输入相关的输入数据,然后运行“a.out < input.txt”,它可以正常工作。因此,问题仅在于定义STDIN的EOF。
如何解决这个问题?
注意:我正在关闭这个问题,并在一个新的问题中提供更多细节reading till EOF in java on cygwin on windows-10

ctrl-z是Unix命令,用于挂起进程。您考虑过MSYS吗?在那里,ctrl-D可以使用。 - Jean-François Fabre
1
使用 stty -a 检查键盘驱动程序生成信号的方式(在 cchars 下查找 eof)。您也可以使用 stty 更改设置,但我不建议这样做。CTRL+D 会“终止 shell”,因为您正在发送 shell 的 EOF。您可以使用 set -o ignoreeof - cdarke
Jean-Francoise:我正在使用Cygwin,而不是MSYS。 - R71
cdarke:我使用了 ignoreeof,见下面我的评论。 - R71
1个回答

2
在类Unix系统上(包括Cygwin),Ctrl-D默认情况下会在从tty(终端/键盘)读取时触发文件结尾条件。可以使用"stty"命令更改此设置,但看起来您还没有这样做(而且您几乎肯定不应该这样做)。
如果您在运行从标准输入读取的程序时输入Ctrl-D,这可能会终止您的程序,具体取决于程序对到达其输入结尾的响应方式。
Ctrl-Z发送一个信号来暂停当前程序(某些程序,如交互式shell,能够处理或忽略该信号)。 (Windows使用Ctrl-Z触发文件结尾。)
您描述的行为表明您正在一个shell提示符下键入Ctrl-D。这会给shell而不是您的程序带来文件结尾条件。 shell默认情况下通过终止来响应此操作;您可以使用"set -o ignoreeof"告诉shell忽略它。
如果您在运行程序时键入Ctrl-D,则应正确触发文件结尾条件并导致程序终止。
更新:通常情况下,您应在任何其他输入之前键入Ctrl-D(结果是程序根本不接收任何输入),或者在键入Return后立即键入Ctrl-D。要在一行中间触发文件结尾,您必须键入两次Ctrl-D。(这通常不是一个好主意,因为它会导致程序看到一个没有终止换行符的部分行。)

stty(没有参数)的输出是什么? - Keith Thompson
速度38400波特率;行=0; ixany - R71
@R71:抱歉,请尝试使用 stty -a 命令。输出结果应该包含类似于 eof = ^D 的内容。在 Windows 下,按 Ctrl-Z 触发文件结束条件。在任何类 Unix 环境下(包括在 Windows 上运行的 Cygwin),按 Ctrl-D 应该触发文件结束条件。而且你需要注意你是将 Ctrl-D 键输入到程序中还是 shell 中。 - Keith Thompson
我在按下回车键后立即输入Ctrl-D。 - R71
我用C++编写了一个小程序,可以读取输入直到EOF,而且^D也可以正常工作。因此,看起来报告的问题与antlr代码有关。感谢stty提示,它帮助指向了问题区域。 - R71
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接