Linux 上的 sleep 系统调用 - 与信号的交互

Linux 上的 sleep 系统调用 - 与信号的交互

我对 Linux 操作系统上的 sleep 文档有疑问。

男人3睡觉说:

关于线程安全,sleep()是“MT-Unsafe sig:SIGCHLD / linux”,这意味着在Linux上sleep()可能会临时安装一个信号处理程序SIGCHLD

然而,同一份文档说“在 Linux 上,sleep()是通过 实现的nanosleep(2)。”

这得到了证实睡眠实施GNU 标准库内。

男人2纳米睡眠说:

“POSIX.1 明确规定它 ( nanosleep) 不与信号交互”。 Nanosleep 可以通过“传递触发调用线程中处理程序的调用的信号”来中断(来自 nanosleep 手册)。

所以问题是:

sleep(3)Linux 上有文档问题吗?

在我看来,“MT-Unsafe sig:SIGCHLD/linux”的文档不正确,因为根据文档,在 Linux 上sleep(3)使用nanosleep(2)它不会干扰。SIGCHLDnanosleep(2)

或者我错过了什么?

答案1

texinfo 的评论来源更明确一点:

@deftypefun {unsigned int} sleep (unsigned int @var{seconds})
@standards{POSIX.1, unistd.h}
@safety{@prelim{}@mtunsafe{@mtascusig{:SIGCHLD/linux}}@asunsafe{}@acunsafe{}}
@c On Mach, it uses ports and calls time.  On generic posix, it calls
@c nanosleep.  On Linux, it temporarily blocks SIGCHLD, which is MT- and
@c AS-Unsafe, and in a way that makes it AC-Unsafe (C-unsafe, even!).

除非这是一个谎言;sleep(3)在 Linux 上不会阻塞SIGCHLD;这只是旧解决方法的剩余部分(2015年移除)针对更旧的 Linux 错误(已在 2.6.32 中修复)。

这是犯罪其中介绍了该语言:

* manual/time.texi: Document MTASC-safety properties.
author  Alexandre Oliva <[email protected]> 
    Sat, 1 Feb 2014 04:51:51 +0000 (02:51 -0200)
committer   Alexandre Oliva <[email protected]> 
    Sat, 1 Feb 2014 04:51:51 +0000 (02:51 -0200)
commit  23e5b8cb1ba7a31450bda75e3f06b7c76e175db4

答案2

对 Linux 内部结构有更多经验的人可能会纠正我,但从周围的文档来看,他们似乎想保留实现sleep()via 的权利alarm(),这将临时安装SIGALRM.

这在实际文档中没有SIGCHLD提到,但它仍然属于“MT-Unsafe sig”。

相关内容