当前位置: 首页 > 面试题库 >

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

赫连越
2023-03-14
问题内容

运行需要终端I输入的程序,可以通过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手册页“描述”部分的第一句对此进行了描述。



 类似资料:
  • 问题内容: 我编写了一个任务,通过套接字发送某些TCP消息。我有一个包含一堆消息和一些时间戳的文件,因此我将该任务编程为TimerTask,并使用带有第一个消息时间戳的Timer对其进行了调度。 完成后,任务运行方法结束,但其关联的线程仍然存在,不会被取消。如果我尝试使用新的时间重新安排任务,则会收到异常消息,通知我无法重新安排已安排的任务或取消的任务。 在重新计划之前,我也尝试过使用cancel

  • 我想在设备重新启动后与启动通知(如消息、Viber通知、Whatsapp等)并排启动锁定屏幕活动。如何做到这一点??.我已经制作了一个广播接收器,它接收引导完成操作,然后启动一个服务,该服务再次用intent.action_screen_off和intent.action_screen_on意图过滤器注册相同的接收器,该接收器启动锁定屏幕活动。以下是我的代码: AndroidManifest.xm

  • 问题内容: 我试图编写一个文件监视器,它将检查文件是否添加了新行,该监视器实际上是一个线程,它将始终由randomaccessfile读取该行。 这是监视器的核心代码: 这是一些帮助类: 这是调用监视器的示例: 现在,我的问题是,如果我仅调用以下代码,代码就可以很好地工作: 这将监视文件的行追加,并通知侦听器。 但是,当我致电: 这意味着我想监视另一个文件而不是之前。 因此,在Monitor中,我

  • 问题内容: 我正在开发一个。是否可以在更改后立即重启?我正在使用CoffeeScript开发它。保存更改后可以观看以便重新启动吗? 问题答案: 您可以创建一个这种意愿的,只是另一个一饮而尽child_process。 我曾经为了接受“主任务”而在需要重新启动时运行。因此,为了运行此程序,您可以调用: 要进行测试,请致电或查看日志。

  • 我在AWS中有一个简单的t2实例,我必须更改RDS DB实例运行的默认时区;由于没有反映任何更改,我决定重新启动RDS实例。 一旦发生这种情况,运行我的的EC2实例开始失败,应用程序返回一个错误,试图连接到数据库。 我还决定重新启动EC2实例(我是AWS的新手)。 在此之后,我无法访问我的webapp,所以我继续通过SSH和连接到EC2实例。 几分钟后,我注意到webapp无法工作,并在一个空白页

  • 问题内容: 我的日食没有启动,因为我的计算机有点死机了,所以我不得不强制重新启动它。当我不得不重新启动时,Eclipse是打开的,我相信这很可能是原因。我不知道该如何解决。每当我尝试打开它时,它都会告诉我检查工作区中的.log文件,并显示: http://paste.strictfp.com/26579 而且我不知道如何解决它。请帮忙? 问题答案: 您缺少 第125行的 类,您必须重新安装才能解决