sigdelset() 函数用于关闭单个位。这是它的实现:
int
sigdelset(sigset_t *set, int signo) //signo is the signal number
{
*set &= ~(1 << (signo - 1)); // turn bit off
return(0);
}
我无法理解这段代码。我认为信号编号看起来像0010
(二进制)。但它看起来不对。
您混淆了人脑如何想象二进制数以及我们如何在 C 中表示它们。
首先,标准 C 中没有二进制符号(但是某些编译器接受0b...
作为扩展)。
其次,1 << (signo - 1)
是二元左移运算符。Signo 可能是要关闭的位的序号,从 1 开始。然后我们从中减去 1,因此我们得到一个从 0 开始的数字(逻辑上的第一位)。然后我们将其左移以获得 2 的幂 (signo - 1),这是一个数字,其二进制表示如下所示:
00000010000000... etc.
^
+- bit #signo - 1
然后该函数使用~
(2 的补码)运算符,这将导致(连同按位和赋值运算符,&=
)关闭该位。