Nom*_*mal 12
在linux和POSIXy系统中,当你在终端中按Ctrl+ 时,标准输入描述符不会被关闭D; 它只会导致伪read()终端层变为可读,返回0.这就是POSIXy系统指示输入结束的方式.
这并不意味着文件描述符(甚至是C库顶部提供的流句柄)都会被关闭.正如Steve Summit在评论中提到的那样,您只需要清除流的输入结束状态clearerr(),以便能够读取更多数据; 这告诉C库您注意到状态发生了变化,但是还是想尝试进一步阅读.
当进程写入文件而另一个进程读取文件时,可能会发生类似的情况.当读者到达文件的末尾时,read()返回0,C库将其理解为输入结束; 它设置了一个内部标志,因此除非你调用clearerr(),否则feof()将为该流返回true.现在,如果编写器写入更多数据,并且读者执行了更多数据clearerr(),则读者可以读取新写入的附加数据.
这是完全正常的,也是预期的行为.
综上所述:
输入结束由read()返回0 的操作指示,但文件描述符状态不会改变,并且可以正常使用.
CtrlD终端上的+ 仅导致发生; 对终端开放的文件描述符不受任何其他方式的影响,并且由前台进程读取终端输入来决定它的作用.允许简单地继续阅读更多数据.
当发生这种情况时,大多数程序都会退出,但这是一种惯例,而不是技术要求.
C库检测到read()返回0,并为该流设置其内部"输入结束"标志.这导致为该流feof()返回true,fgets()返回NULL,fgetc()返回EOF等等.
调用clearerr()流句柄会清除该标志,以便下次读取尝试实际上会尝试从描述符中读取更多数据.
这在man 3 clearerr手册页的"描述"部分的第一句中描述.