Por que o sigset_t em glibc / musl 128 bytes é grande no Linux de 64 bits?

0

Por que sigset_t em Linux de 128 bits é grande em glibc e musl?

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

Não deveria 64/8 = 8 ( number_of_signals / CHAR_BIT ) ser suficiente?

    
por PSkocik 20.10.2017 / 15:22

1 resposta

5

Eu não sei o motivo original; em 1996, o cabeçalho específico do Linux era adicionado com a seguinte definição:

/* 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;

e este limite de "1024 sinais" foi preservado na definição atual:

/* 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;

que torna o cálculo baseado em 1024 mais claro (e resulta em 16 longs não assinados em x86 de 64 bits, isto é, 128 bytes).

Presumivelmente, os mantenedores da glibc queriam deixar espaço para crescimento ...

musl quer compatibilidade ABI com glibc para sigaction , então usa o mesmo tamanho de 1024 bits (128 bytes) :

TYPEDEF struct __sigset_t { unsigned long __bits[128/sizeof(long)]; } sigset_t;
    
por 20.10.2017 / 16:15