我正在从命令提示符读取字符,并检查 EOF 以终止程序。
但是当我发出命令Ctrl+时D,它并没有被视为 EOF。请具体说明要做什么。
Ctrl+C正在工作,这会终止整个进程。
答案1
假设 tty“cooked”模式,ctrl-D通过终止行输入处理并将已输入的数据发送到应用程序来工作。因此,如果您键入“abc”,后跟ctrl-D这三个字节将被发送到应用程序。
现在,应用程序通常如何确定文件结尾?当读取返回 0 字节时,假定 EOF。所以你需要让读取返回 0 字节。如果您先点击enter,然后点击ctrl- D,则您键入的所有内容都会与换行符一起发送到应用程序。然后ctrl-D会使您输入的任何数据(即无数据!)发送到应用程序,该应用程序读取 0 字节,并假定 EOF。
如果您在enter点击之前输入任何内容ctrl-D那么应用程序会获取这些击键,并等待更多。因此,要在不先点击 的情况下生成 EOF enter,请连续点击ctrl-两次。D
所以回答你的问题:在点击ctrl-之前你是否首先输入了任何字符(除了换行符) D?如果是这样,请连续尝试两次。
这可以用例如:
$ wc -l
test123 0 1 7
(在 后点击ctrl-两次。)Dtest123
该wc
实用程序显示读取的行数、单词数和字符数。行数为 0,因为您没有输入换行符,并且行数test123
为 1 个单词和 7 个字符长。
答案2
没有“EOF字符”,ctrl-D由终端驱动程序翻译成文件结尾状况,传输给任何试图读取该内容的人(没有它,read(2)
等待调用的输入或其他输入将永远等待更多输入)。这取决于 tty 所处的模式,前面的讨论适用于熟模式(驱动程序收集行,允许有限形式的行编辑,将整行发送给阅读器)。 Cooked 模式是默认模式,大多数从键盘读取的程序都使用该模式。在原始模式下(例如设置为获得完全控制的编辑器vi(1)
或其他编辑器),程序将准确地获取键入的每个字符。