2

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

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

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

4

1 回答 1

2

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

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

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

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

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

于 2012-08-12T08:32:30.940 回答