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;

관련 정보