免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1837 | 回复: 6
打印 上一主题 下一主题

帮忙解释一段APUE中的代码,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-09 20:38 |只看该作者 |倒序浏览
程序清单10-9 sigaddset, sigdelset和sigismember的实现

#include <signal.h>
#include <errno.h>

/* <signal.h> usually defines NSIG to include signal number 0 */         <signal.h>头文件通常定义NSIG来包含信号编号0?是这个意思吗?NSIG具体是等于多少呢?我查了<signal.h>也没查出个所以然来
#define SIGBAD(signo) ((signo) <= 0 || (signo) >= NSIG)           

int
sigaddset(sigset_t *set, int signo)
{
        if(SIGBAD(signo))        { errno = EINVAL; return(-1); }
        *set |= 1 << (signo-1) ;                /* turn bit on */       这句是几乎不懂,大概是基础太差了,郁闷阿!!!为什么是signo-1?接着是1<<(signo-1)位移运算?然后是和信号集按位或吧?实在不明白为什么,希望前辈们可以详细解释一下,不胜感激啊!这句明白了,下面两句应该就没问题了        return(0);
}

int
sigdelset(sigset_t *set, int signo)
{
        if(SIGBAD(signo)) { errno = EINVAL; return(-1); }
        set &= ~(1 <<(signo-1));                /*turn bit off*/      
        return(0);
}

int sigismember(const sigset_t *set, int signo)
{
        if(SIGBAD(signo)) { errno = EINVAL; return(-1); }
        return((*set & (1 << (signo-1))) != 0);
}

在此先谢谢大家的热心帮忙!不胜感激!

[ 本帖最后由 李某人 于 2009-5-10 12:29 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-05-09 21:12 |只看该作者
顶一个

论坛徽章:
0
3 [报告]
发表于 2009-05-09 21:15 |只看该作者
一定有,继续找。

论坛徽章:
0
4 [报告]
发表于 2009-05-09 21:20 |只看该作者

我有好几个疑问噢

论坛徽章:
0
5 [报告]
发表于 2009-05-09 23:34 |只看该作者
看一下c语言位操作的

论坛徽章:
0
6 [报告]
发表于 2009-05-10 09:58 |只看该作者
1 => 其二进制码为:第一位(bit0)为 “1”,其它位全零
1 << (signo-1)  => 把 “1” 右移 signo-1 位。即除第 signo 为 "1" 之外,所有位为 0.
|= => 把 set 的第signo位置为一,其它位不变。也就是把相应的signal加到set 中

论坛徽章:
0
7 [报告]
发表于 2009-05-10 12:26 |只看该作者
先谢过楼上的回答。
为了弄清楚这题目,我补了一下老谭的书里和位运算相关的章节 ,算是把这几行代码弄明白了   

1 << (signo-1)  => 把 “1” 右移 signo-1 位。即除第 signo 为 "1" 之外,所有位为 0.          //纠正:这句有误,是左移才对

*set |= 1 << (signo-1) ;            //按位或:两个相应的二进位中只要有一个为1,该位的结果值就为1。这里就是打开信号集*set中的某一位(将该位设置为1)

摘自APUE里的原话:因为没有编号为0的信号,所以从信号编号中减去1以得到要处理位的位编号数。   //我原先不明白为什么用signo-1,仔细看了这句话才明白过来



遗留问题:还是不知道NSIG是什么值,没搜出来,大家不妨也搜一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP