栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Ctrl + D后如何重新启动stdin?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Ctrl + D后如何重新启动stdin?

通常在linux和POSIXy系统上,当您在终端中按

Ctrl
+
时,标准输入描述符不会关闭
D
。它只是使伪
read()
终端层变得可读,并返回0。这就是POSIXy系统指示输入结束的方式。

这并不意味着文件描述符(甚至C库在其顶部提供的流句柄)都已关闭。正如史蒂夫·萨米特(Steve Summit)在评论中提到的那样,您只需使用即可 清除
流的输入结束状态

clearerr()
,以便能够读取更多数据。这告诉C库您已经注意到状态变化,但是无论如何都想尝试进一步阅读。

当进程正在写入文件,而另一个进程读取文件时,可能会发生类似情况。当阅读器到达文件末尾时,a

read()
返回0,C库将其理解为输入末尾;它设置了一个内部标志,因此,除非您调用
clearerr()
,否则
feof()
将对该流返回true。现在,如果写入者写入了更多数据,而读取者执行了
clearerr()
,则读取者可以读取新写入的附加数据。

这是完全正常的,并且是预期的行为。

综上所述:

  • 输入结束由

    read()
    返回0 的操作表示,但文件描述符状态不变,可以正常使用。

  • Ctrl
    +
    D
    在终端上只会导致这种情况发生;向终端打开的文件描述符不会受到任何其他影响,这取决于前台进程读取终端输入来决定其作用。只允许继续读取更多数据。

大多数程序会在发生这种情况时退出,但这只是一个约定,而不是技术要求。

  • C库检测到

    read()
    返回的0,并为该流设置其内部的“输入结束”标志。这会导致
    feof()
    返回true,
    fgets()
    返回NULL,
    fgetc()
    返回
    EOF
    ,等等,对于流。

  • 调用

    clearerr()
    流句柄会清除该标志,以便下一次读取尝试实际上将尝试从描述符中读取更多数据。

man 3 clearerr
手册页“描述”部分的第一句对此进行了描述。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/399197.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号