与sigdelset()函数混淆

时间:2012-08-12 08:24:05

标签: c linux signals

sigdelset()函数用于关闭单个位。这是它的实现:

    int
    sigdelset(sigset_t *set, int signo)  //signo is the signal number
    {
    *set &= ~(1 << (signo - 1)); // turn bit off 
    return(0);
    }

我无法理解这段代码。我认为信号编号看起来像0010(二进制)。但它看来不对。

1 个答案:

答案 0 :(得分:2)

你混淆了人类大脑如何想象二进制数以及我们如何在C中表示它们。

首先,标准C中没有二进制表示法(但某些编译器接受0b...作为扩展名)。

其次,1 << (signo - 1)是二元左移运算符。 Signo可能是从1开始关闭的位的序号。然后我们从中减去1,因此我们得到一个从0开始的数字(逻辑上是第一位)。然后我们将它移位以获得2的幂(signo - 1),这是二进制表示的一部分:

00000010000000... etc.
      ^
      +-  bit #signo - 1

然后该函数使用~(2的补码)运算符,这将导致(与按位和赋值运算符&=一起)关闭该位。