- 1、本文档共21页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6单元 信号
* * * 最低位代表信号1 * 信号集给我们提供了一个能表示多个信号的是数据类型(sigset_t), 它将在sigprocmask, sigpending, sigsuspend之类的函数中用到, 这些函数我会在以后的文章中介绍. 1. 信号集相关函数: #include?signal.hint?sigemptyset(sigset_t?*set);成功则返回0,?出错则返回-1. ?这个函数用作初始化set指向的信号集, 清空其中的所有信号. ? #include?signal.hint?sigfillset(sigset_t?*set);成功则返回0,?出错则返回-1. 这个函数用作初始化set指向的信号集, 填充其中的所有信号. ? #include?signal.hint?sigaddset(sigset_t?*set,?int?signo);int?sigdelset(sigset_t?*set,?int?signo);成功则返回0,?出错则返回-1. 这两个函数用作向set指向的信号集中, 增加/删除一个signo代表的信号. #include?signal.h int?sigismember(const?sigset_t?*set,?int?signo); 真则返回1,?假则返回0,?出错则返回-1. 这个函数用作判断signo信号是否在set指向的信号集中. 2. 宏: 在signal.h中有两个宏: #define?sigemptyset(ptr)??(*(ptr)?=?0) #define?sigfillset(ptr)??(*ptr?=?~(sigset_t)0,?0) 这两个宏分别定义了sigemptyset和sigfillset两个函数的行为. sigemptyset: 把ptr指向的地址的内容设为0. sigfillset: 这是一个逗号表达式, 把0转换为sigset_t类型, 然后按位取反, 并返回0. 通过以上两个宏, 我们可以确切地说, sigset_t是用多位(比信号总数更多的位数)来表示信号集概念的. 因此, sigaddset: 将某一位设置为1. sigdelset: 将某一位设置为0. sigismember: 测试某一个指定位. 下面我们来实现这些函数. 3. 实例: #include?signal.h#include?errno.h/*?NSIG?defined?in?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);????????return?0;}int?sigdelset(sigset_t?*set,?int?signo){????if?(SIGBAD(signo))????{????????errno?=?EINVAL;????????return?(-1);????}????*set?=?~(1??(signo?-1));????return?0;}int?sigismember(const?sigset_t?*set,?int?signo){????if?(SIGBAD(signo))????{????????errno?=?EINVAL;????????return?(-1);????}????????return?((*set??(1??(signo?-1)))?!=?0);} 说明一下里面的几个细节: signo - 1: 因为不存在编号为0的信号, 也就是第0位与编号为1的信号是对应的, 所以减1. SIGBAD: 小于等于0, 或者大于最大信号编号NSIG. 1 : 1的左移位操作, 右边补0, 所以执行或操作时直接实现添加; 执行与操作时需要先取反, 以保证本位为0, 其他位不变, 这样来实现删除. sigismember: 最后一个return语句看上去有些复杂. 想起来很难想到, 但看起来应该不难. 执行移位后的与操作, 当存在时使本位保持不变, 其他位清零; 当不存在时, 全部清零. 然后判断是否为0, 这样来实现判断存在性. * 简介 restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即:它告诉
文档评论(0)