64ビットLinuxでglibc / muslのsigset_tが128バイトであるのはなぜですか?

64ビットLinuxでglibc / muslのsigset_tが128バイトであるのはなぜですか?

sigset_t64ビット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) で十分ではありませんか?

答え1

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個のunsigned longを生成します。)つまり128バイト)。

おそらくglibc管理者は成長の余地を残したいと思うでしょう。

musl は glibc との ABI 互換性を目指しているsigactionので、以下を使用します。同じ1024ビット(128バイト)サイズ:

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

関連情報