Linux-Kernel
Linux 上的 sleep 系統呼叫 - 與信號的互動
我對 Linux 作業系統上的睡眠文件有疑問。
男人 3 睡覺說:
關於執行緒安全,
sleep()
是“MT-Unsafe sig:SIGCHLD/linux”,這意味著在 Linux 上sleep()
可能會臨時為SIGCHLD
信號安裝一個信號處理程序。但是,相同的文件說“在 Linux 上,
sleep()
是通過nanosleep(2)
.”實現的。GNU 標準庫中的sleep 實現證實了這一點。
“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