运维开发网
广告位招商联系QQ:123077622
 
广告位招商联系QQ:123077622

Ctrl D后如何重启stdin?

运维开发网 https://www.qedev.com 2020-07-05 13:56 出处:网络
运行一个期望从终端输入的程序我可以通过Ctrl D“关闭”stdin.之后有没有办法重新打开stdin?
运行一个期望从终端输入的程序我可以通过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手册页的“描述”部分的第一句中描述.

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号