为什么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
) 还不够吗?
答案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 个无符号长整型,IE128 字节)。
大概 glibc 维护者想要留出成长空间……
musl 的目标是与 glibc for 实现 ABI 兼容性sigaction
,因此它使用相同的 1024 位(128 字节)大小:
TYPEDEF struct __sigset_t { unsigned long __bits[128/sizeof(long)]; } sigset_t;