Linux

為什麼 64 位 Linux 上 glibc/musl 中的 sigset_t 為 128 字節?

  • October 20, 2017

為什麼sigset_t在 64 位 Linux 上 glibc 和 musl 有 128 字節大?

#include <signal.h>
#include <stdio.h>
int main()
{
   printf("%zu\n", sizeof(sigset_t)); //prints 128 with both glibc and musl
}

64 / 8 = 8 ( number_of_signals / CHAR_BIT) 不應該足夠嗎?

我不知道原來的原因;早在 1996 年,Linux 特定的標頭就添加了以下定義:

/* A `sigset_t' has a bit for each signal.  Having 32 * 4 * 8 bits gives                                           
  us up to 1024 signals.  */                                                                                      
#define _SIGSET_NWORDS 32                                                                                          
typedef struct                                                                                                     
{                                                                                                                  
 unsigned int __val[_SIGSET_NWORDS];                                                                              
} __sigset_t;

並且這個“1024 信號”限制已保留在目前定義中:

/* A `sigset_t' has a bit for each signal.  */                                                                     

#define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))                                                   
typedef struct                                                                                                     
 {                                                                                                                
   unsigned long int __val[_SIGSET_NWORDS];                                                                       
 } __sigset_t;

這使得基於 1024 的計算更清晰(並在 64 位 x86 上產生 16 個無符號長整數,128 個字節)。

大概 glibc 維護者想留出增長空間……

musl 旨在 ABI 與 glibc 兼容sigaction,因此它使用相同的 1024 位(128 字節)大小

TYPEDEF struct __sigset_t { unsigned long __bits[128/sizeof(long)]; } sigset_t;

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