Nam*_*ull 4 c unix shell stdin input
以下是我的代码,我用它fgetc来获取输入stdin。(从 UNIX shell 运行程序)
我不明白的是,当我从键盘输入一些字符,然后按ctrl + D然后按 时ENTER,程序不会停止。我好像EOF已经传送到程序了,为什么还不停止呢?
我还发现,如果我按ENTER,那么ctrl + D,程序确实会停止,但为什么呢?
#include "stdio.h"
int main()
{
char ch;
int i;
for (i = 0; i < 200; i++)
{
ch = fgetc(stdin);
if (ch == EOF)
break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
说 Ctrl-D 发送 EOF 是对孩子的教育谎言。它实际上所做的是使read()终端中正在进行的任何操作立即返回,并包含当前行缓冲区的内容(如果有)。
协同作用的发生是因为 Unix 约定是read()0 字节的 a 代表 EOF。
这意味着如果您在空缓冲区中按 Ctrl-D,则将read()返回零字节,并且规范程序会将其解释为文件结尾。这显然只是一种幻觉,因为您仍然可以在终端上输入更多内容,而不太规范的程序可以根据需要继续阅读。
如果您在输入一些数据后按 Ctrl-D,那么该数据将被返回,并且规范程序将继续读取以查找换行符或它正在查找的其他内容。
这就是为什么只有在另一个 Ctrl-D (第一个刷新缓冲区,第二个返回现在为空的缓冲区)之后或按 Enter (出于相同原因)之后按下 Ctrl-D 时,才会在规范程序中触发 EOF 行为。