Linux-Kernel

如何在執行時建立 SIGRTMIN?

  • February 29, 2016

繼續閱讀signal(7)我現在可以看到:兩個,但是一次:三個;超過 31 的信號編號保留供實時信號系統使用,不應使用:

實時信號

Linux 支持最初在 POSIX.1b 實時擴展中定義的實時信號(現在包含在 POSIX.1-2001 中)。支持的實時信號範圍由宏SIGRTMINSIGRTMAX. POSIX.1-2001 要求實現至少支持POSIX_RTSIG_MAX(8)實時信號。

Linux 核心支持 32 種不同的實時信號,編號為 33 到 64。但是,glibcPOSIX 執行緒實現內部使用兩個(對於 NPTL)或三個(對於 LinuxThreads)實時信號(參見 參考資料pthreads(7)),並調整值適當的SIGRTMIN(到 34 或 35)。因為可用實時信號的範圍因glibc執行緒實現而異(根據可用的核心和 glibc,這種變化可能發生在執行時),而且實際上實時信號的範圍在 UNIX 系統中有所不同,程序不應該使用硬編碼數字來指代實時信號,但應始終使用符號 來指代實時信號SIGRTMIN+n,並包括SIGRTMIN+n不超過的適當(執行時)檢查SIGRTMAX.

那麼,當程序執行時,如何確定 SIGRTMIN 的值(在需要為其自身和任何子級設置信號處理的 C 程序中)?我在這裡查看了問題和答案,但他們似乎都認為SIGRTMIN這是頁面上說不應該這樣做的#define SIGRTMIN 34時候!man

愚蠢的是,我忘記了#defined 的東西不是恆定的,除非它們是這樣寫的!

正如@RuiFRibeiro在底部/usr/include/特定於體系結構的/bits/signum.h包含文件中指出的那樣,是一對提供所需內容的 MACROS:

#define SIGUNUSED   31

#define _NSIG       65  /* Biggest signal number + 1  
                  (including real-time signals).  */

#define SIGRTMIN        (__libc_current_sigrtmin ())  
#define SIGRTMAX        (__libc_current_sigrtmax ())  

/* These are the hard limits of the kernel.  These values should not be
  used directly at user level.  */
#define __SIGRTMIN  32  
#define __SIGRTMAX  (_NSIG - 1)

所以現在我知道如何防止信號處理程序被嘗試替換那些保留的處理程序 - 我懷疑任何嘗試都會被拒絕,但是對於錯誤報告,最好知道限制是什麼,而不是從一個爛中確定它們看看方法!

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