我对 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)
它不会干扰。SIGCHLD
nanosleep(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”。