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的补码)运算符,这将导致(以及按位和赋值运算符&=)关闭该位。

关于c - 与sigdelset()函数混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11920793/

10-10 19:28