Linux-Kernel

Linux 上的 sleep 系統呼叫 - 與信號的互動

  • February 26, 2021

我對 Linux 作業系統上的睡眠文件有疑問。

男人 3 睡覺說:

關於執行緒安全,sleep()是“MT-Unsafe sig:SIGCHLD/linux”,這意味著在 Linux 上sleep()可能會臨時為SIGCHLD信號安裝一個信號處理程序。

但是,相同的文件說“在 Linux 上,sleep()是通過nanosleep(2).”實現的。

GNU 標準庫中的sleep 實現證實了這一點。

man 2 nanosleep說:

“POSIX.1 明確指定它 ( nanosleep) 不與信號互動”。Nanosleep 可以被“在呼叫執行緒中觸發處理程序呼叫的信號的傳遞”(來自 nanosleep 手冊)中斷。

所以問題是:

sleep(3)Linux 上是否存在文件問題?

在我看來,說“MT-Unsafe sig:SIGCHLD/linux”的文件是不正確的,因為在 Linux 上sleep(3)使用nanosleep(2)不會干擾SIGCHLD,根據nanosleep(2)文件。

還是我錯過了什麼?

來自 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 <aoliva@redhat.com> 
   Sat, 1 Feb 2014 04:51:51 +0000 (02:51 -0200)
committer   Alexandre Oliva <aoliva@redhat.com> 
   Sat, 1 Feb 2014 04:51:51 +0000 (02:51 -0200)
commit  23e5b8cb1ba7a31450bda75e3f06b7c76e175db4

引用自:https://unix.stackexchange.com/questions/528362