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

如何知道Linux系统调用是否可重新启动?

谷涵容
2023-03-14
问题内容

SA_RESTART根据man signal(7),如果在安装信号处理程序时使用了该标志,则可以通过内核透明地重新启动某些系统调用:

如果信号处理程序中断了对以下接口之一的阻塞调用, 则如果使用了SA_RESTART标志,则在信号处理程序返回后该调用将自动重新启动
;否则,调用将失败,并显示错误EINTR:

然后,它提到了一些可以(也不能重启)的系统调用,但是close()在任何地方都没有提到,我怎么知道close()或者任何其他函数是否可以重启?会POSIX指定它还是Linux特定的行为?在哪里可以找到更多信息?


问题答案:

根据POSIX.1-2008,该SA_RESTART标志适用于所有可中断函数(记录为失败的所有函数EINTR):

SA_RESTART

该标志影响可中断函数的行为。也就是说,将errno设置为[EINTR]时指定失败的那些。如果置位,并且指定为可中断的功能被该信号中断,则该功能应重新启动,并且除非另有说明,否则不会以[EINTR]失败。如果重新启动了使用超时的可中断功能,则重新启动后的超时持续时间将设置为未指定的值,该值不会超过原始超时值。如果未设置标志,则此信号中断的可中断功能将因errno设置为[EINTR]而失败。

也就是说,未重启的功能列表是特定于Linux的(可能算作bug)。



 类似资料:
  • 系统调用 我们要想启动一个进程,需要操作系统的调用(system call)。实际上操作系统和普通进程是运行在不同空间上的,操作系统进程运行在内核态(todo: kernel space),开发者运行的进程运行在用户态(todo: user space),这样有效规避了用户程序破坏系统的可能。 如果用户态进程想执行内核态的操作,只能通过系统调用了。Linux提供了超多系统调用函数,我们关注与进程相

  • 问题内容: 每次我运行使用Flask-SQLAlchemy的应用程序时,都会收到以下警告,提示该SQLALCHEMY_TRACK_MODIFICATIONS选项将被禁用。 我试图找出此选项的作用,但是Flask-SQLAlchemy文档尚不清楚该跟踪的用途。 · 如果设置为True(默认值),Flask-SQLAlchemy将跟踪对象的修改并发出信号。这需要额外的内存,如果不需要,可以将其禁用。

  • 问题内容: 我们有一个数据库,每天cronjob在午夜更新,我们从外部XML获取新数据。 我们要做的是插入所有新内容,并在键重复的情况下更新该字段。 我们想知道的是实际插入了哪些行,这意味着我们想要一个新项目的列表。是否有可能返回新插入的查询?基本上,我们将需要获取所有新的ID,而不是新插入的数量。 谢谢 问题答案: 添加一列并更改您的查询: 您也可以在触发器中增加它,使您可以保持查询不变。

  • Linux 系统的启动,从计算机开机通电自检开始,一直到登陆系统,需要经历多个过程。学习 Linux 的启动过程,有助于了解 Linux 系统的结构,也对系统的排错有很大的帮助。 CentOS 6.x 系统启动过程发生了较大的变化,使用 Upstart 启动服务取代了原先的 System V init 启动服务。Upstart 启动服务的效率更高,启动速度更快。 Linux 系统启动过程比较复杂,

  • 问题内容: 即使文件在远程http服务器上不存在,它也会以静默方式返回,它只是将html页面保存到命名文件中。例如: 即使abc.jpg在google.com服务器上不存在,它只是默默返回,生成的不是有效的jpg文件,它实际上是html页面。我猜返回的标头(一个httplib.HTTPMessage实例)可以用来实际上告诉检索是否成功,但是我找不到的任何文档。 有人可以提供有关此问题的一些信息吗?

  • 我有一个Jenkins项目,在SCM中存储的JenkinsFile中定义了一个声明性管道。我使用“来自SCM的管道脚本”选项。 有时,如果出现故障,我会在jenkins工作区快速修复,并从特定阶段开始重新运行管道。这是很好的工作。 有些情况下,我需要更新JenkinsFile,然后用更新后的Jenkins文件进行“阶段重启”。然而,我在workspace文件夹中的任何地方都找不到JenkinsFi