0

我必须使用我学校提供的代码,但我不明白这个关于轮班的功能,逐位

如果有人可以帮助我。这将是非常好的。

谢谢!

4

4 回答 4

5

它过于复杂。在每次迭代中通过单击来更好地移动位模式:

int c ;
for (c = 'e'; c; c>>=1)
{
   kill(pid, (c & 1) ? SIGUSR1 : SIGUSR2);
}

作为副作用,这避免了魔法常数8(应该是CHAR_BIT,恕我直言)

顺便说一句:这段代码并不完全等价,原来的总是发出 8 次 kill() 调用,这一次将在第七次之后停止 (给定 CHAR_BIT==8) ,所以额外

kill(pid, SIGUSR2);

将需要完成这项工作。

于 2013-03-24T22:42:42.613 回答
1

对于初学者,ASCII 中的字符 e 是 hex 65= binary01100101

代码的作用是在每次迭代时将该值再右移一位,当移位后最右边的位为 1 时,它会触发 SIGUSR1,否则触发 SIGUSR2。

现在,如果您问我该代码的有用效果可能是什么,我不知道。

于 2013-03-24T22:40:56.517 回答
1

这是一种可怕的写作方式c & (1 << charac)。它测试是否设置了第 charac'th 位,然后使用 SIGUSR1,否则使用 SIGUSR2。

于 2013-03-24T22:40:32.063 回答
0

c >> charac 将位向右移动 charac 次(因此如果 charax 为 3,它将向右移动 3 次

& 1 测试要设置的最低位是否已设置

? SIGUSr1 : SIGUSR2 this 使用之前测试的结果,如果设置了,则使用 sigusr1,否则使用 sigusr2

于 2013-03-24T22:39:54.313 回答