【问题标题】:what is EOF in cygwin in windows 10什么是 Windows 10 中 cygwin 中的 EOF
【发布时间】:2016-09-03 18:10:51
【问题描述】:

我曾经在 win8.1 上运行 cygwin,同时给一个程序输入 CTRL-Z 用来表示 EOF。今天我在win10上安装了cygwin,运行“a.out”。输入输入数据后,当我按下 CTRL-Z 时,我会收到“暂停”消息,并返回 shell 提示符。我用 bash 和 csh 试过这个,结果相同。 CTRL-D 也不起作用,它正在杀死 shell。

为了确认只是这个问题,没有其他问题,我新建了一个input.txt文件,在里面输入了相关的输入数据,运行“a.out

如何解决这个问题?

注意:我将结束这个问题,并在一个新问题reading till EOF in java on cygwin on windows-10

中提供更多细节

【问题讨论】:

  • ctrl-z 是用于挂起进程的 unix 命令。你考虑过 MSYS 吗? ctrl-D 在那里工作。
  • 检查键盘驱动程序使用stty -a 生成信号的方式(在cchars 下查找eof)。您也可以使用stty 更改设置,但我不建议这样做。 CTRL+D “杀死外壳”,因为您正在发送外壳 EOF。你可以使用set -o ignoreeof
  • Jean-Francoise:我使用的是 cygwin,而不是 msys。
  • cdarke:我使用了ignoreeof,请参阅下面的评论。

标签: bash shell cygwin


【解决方案1】:

在包括 Cygwin 在内的类 Unix 系统上,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-Z 曾经在我使用 win8.1 的笔记本电脑中作为 EOF 工作。在使用 win10 的新笔记本电脑中,并且新安装了 cygwin,这不再工作了。按照建议,我现在做了“set -o ignoreeof”。现在,当我在相关输入后按 Ctrl-D 时,什么也没有发生(看起来 Ctrl-D 被简单地忽略了),当我按 Ctrl-Z 时,我现在收到消息“已停止”而不是“暂停”。但无论哪种方式,程序都会在该点停止,并且不会打印其预期的输出。不,我没有使用 stty。
  • stty 的输出是什么(不带参数)?
  • 速度 38400 波特;线 = 0;伊克斯尼
  • @R71:对不起,试试stty -a。输出应包括类似eof = ^D 的内容。 Ctrl-Z 触发Windows 下 的文件结束条件。在任何类 Unix 环境下(包括 Cygwin,即使它在 Windows 下运行),Ctrl-D 应该触发和文件结束条件。并且您需要密切注意您是在程序中还是在 shell 中键入 Ctrl-D。
  • 谢谢。 “stty -a”报告“eof = ^D; susp = ^Z”。所以现在我很困惑。我运行程序(a.out)并输入输入,然后按 ^D,没有任何反应,程序似乎正在等待进一步的输入(为什么??)。然而,当我运行“a.out
猜你喜欢
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
相关资源
最近更新 更多