如何在 Ctrl+D 之后重新启动 stdin?
- 2024-11-11 08:27:00
- admin 原创
- 22
问题描述:
运行需要终端输入的程序时,我可以通过 Ctrl+D 来“关闭”stdin。之后有没有办法重新打开 stdin?
解决方案 1:
在Linux的并且在 POSIXy 系统上,当您在终端中按下Ctrl
+时,标准输入描述符不会关闭;它只是使伪终端层变得可读,并返回 0。这就是 POSIXy 系统指示输入结束的方式。D
`read()`
这并不意味着文件描述符(或 C 库在其上提供的流句柄)被关闭。正如 Steve Summit 在评论中提到的,您只需使用清除流的输入结束状态clearerr()
,即可读取更多数据;这会告诉 C 库您注意到了状态变化,但无论如何都想尝试进一步读取。
当一个进程正在写入文件,而另一个进程正在读取文件时,也会出现类似的情况。当读取器到达文件末尾时, aread()
返回 0,C 库将其理解为输入结束;它会设置一个内部标志,因此除非您调用clearerr()
,否则feof()
将为该流返回 true。现在,如果写入器写入更多数据,而读取器执行clearerr()
,则读取器可以读取新写入的附加数据。
这是完全正常且预期的行为。
总之:
输入结束通过
read()
操作返回0来表示,但是文件描述符状态不变,可以正常使用。Ctrl
+D
在终端上只会导致这种情况发生;打开到终端的文件描述符不会受到任何其他影响,由读取终端输入的前台进程决定它要做什么。它只需继续读取更多数据即可。
当发生这种情况时,大多数程序都会退出,但这是一种惯例,根本不是技术要求。
C 库检测到
read()
返回 0,并为该流设置其内部“已看到输入结束”标志。这会导致该流feof()
返回 true、fgets()
返回 NULL、fgetc()
返回EOF
等等。调用
clearerr()
流句柄会清除标志,以便下一次读取尝试实际上会尝试从描述符中读取更多数据。
这在手册页的描述部分的第一句中有描述man 3 clearerr
。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件