一尘不染

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

linux

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

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

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


阅读 254

收藏
2020-06-03

共1个答案

一尘不染

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

SA_RESTART

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

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

2020-06-03