加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

Ctrl D后如何重启stdin?

发布时间:2020-12-13 23:54:49 所属栏目:Linux 来源:网络整理
导读:运行一个期望从终端输入的程序我可以通过Ctrl D“关闭”stdin.之后有没有办法重新打开stdin? 解决方法 在 linux和POSIXy系统中,当您在终端中按Ctrl D时,标准输入描述符不会关闭;它只是使伪终端层变得可读,read()返回0.这就是POSIXy系统指示输入结束的方式.
运行一个期望从终端输入的程序我可以通过Ctrl D“关闭”stdin.之后有没有办法重新打开stdin?

解决方法

在 linux和POSIXy系统中,当您在终端中按Ctrl D时,标准输入描述符不会关闭;它只是使伪终端层变得可读,read()返回0.这就是POSIXy系统指示输入结束的方式.

这并不意味着文件描述符(甚至是C库顶部提供的流句柄)都会被关闭.正如Steve Summit在评论中提到的那样,您只需要使用clearerr()清除流的结束输入状态,以便能够读取更多数据;这告诉C库您注意到状态发生了变化,但是还是想尝试进一步阅读.

当进程写入文件而另一个进程读取文件时,可能会发生类似的情况.当读者到达文件末尾时,read()返回0,C库将其理解为输入结束;它设置了一个内部标志,因此除非你调用clearerr(),否则feof()将为该流返回true.现在,如果编写器写入更多数据,并且读取器更清晰(),则读者可以读取新写入的附加数据.

这是完全正常的,也是预期的行为.

综上所述:

>输入结束由read()操作返回0指示,但文件描述符状态不会改变,可以正常使用.
>终端上的Ctrl D仅导致发生;对终端开放的文件描述符不受任何其他方式的影响,并且由前台进程读取终端输入来决定它的作用.允许简单地继续阅读更多数据.

当发生这种情况时,大多数程序都会退出,但这是一种惯例,而不是技术要求.
> C库检测到read()返回0,并为该流设置其内部“输入结束”标志.这会导致feof()返回true,fgets()返回NULL,fgetc()返回EOF,依此类推,用于该流.
>在流句柄上调用clearerr()会清除该标志,以便下次读取尝试实际上会尝试从描述符中读取更多数据.

这在man 3 clearerr手册页的“描述”部分的第一句中描述.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读