信号集给我们提供了一个能表示多个信号的是数据类型(sigset_t),

它将在sigprocmask, sigpending, sigsuspend之类的函数中用到,

这些函数我会在以后的文章中介绍.

1. 信号集相关函数:

#includeintsigemptyset(sigset_t*set);

成功则返回0, 出错则返回-1.

这个函数用作初始化set指向的信号集,

清空其中的所有信号.

#includeintsigfillset(sigset_t*set);

成功则返回0, 出错则返回-1.

这个函数用作初始化set指向的信号集,

填充其中的所有信号.

#includeintsigaddset(sigset_t*set,intsigno);intsigdelset(sigset_t*set,intsigno);

成功则返回0, 出错则返回-1.

这两个函数用作向set指向的信号集中,

增加/删除一个signo代表的信号.

#include

intsigismember(constsigset_t*set,intsigno);

真则返回1, 假则返回0,

出错则返回-1.

这个函数用作判断signo信号是否在set指向的信号集中.

2. 宏:

在signal.h中有两个宏:

#definesigemptyset(ptr) (*(ptr) = 0)#definesigfillset(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#include#defineSIGBAD(signo)

((signo) <= 0 || (signo) >=

NSIG)intsigaddset(sigset_t*set,intsigno)

{if(SIGBAD(signo))

{

errno=EINVAL;return(-1);

}*set|=1<

}intsigdelset(sigset_t*set,intsigno)

{if(SIGBAD(signo))

{

errno=EINVAL;return(-1);

}*set&=~(1<

}intsigismember(constsigset_t*set,intsigno)

{if(SIGBAD(signo))

{

errno=EINVAL;return(-1);

}return((*set&(1<

}

说明一下里面的几个细节:

signo - 1: 因为不存在编号为0的信号,

也就是第0位与编号为1的信号是对应的, 所以减1.

SIGBAD: 小于等于0,

或者大于最大信号编号NSIG.

1 << :

1的左移位操作, 右边补0, 所以执行或操作时直接实现添加; 执行与操作时需要先取反, 以保证本位为0, 其他位不变,

这样来实现删除.

sigismember: 最后一个return语句看上去有些复杂.

想起来很难想到, 但看起来应该不难. 执行移位后的与操作, 当存在时使本位保持不变, 其他位清零; 当不存在时, 全部清零.

然后判断是否为0, 这样来实现判断存在性.

linux 信号集 同步,linux信号集相关推荐

  1. Linux信号 四 异步等待信号与同步等待信号接口

    信号的同步等待和异步等待区别就是信号处理函数的执行与否,异步等待是信号处理函数已经执行了,同步等待是信号处理函数还没有执行. 异步等待接口:pause() 和 sigsuspend() 1. paus ...

  2. Linux Mysql主从同步常见问题合集

    1.1       常见问题 1.Slave I/O: error connecting to master 'backup@192.168.1.x:3306'-retry-time: 60 retr ...

  3. linux目录自动同步,Linux下rsync+inotify实现实时文件自动同步

    背景:随着时代的发展,手工的同步文件的功能已经不适合为高效的现代化企业的服务了. rsync的局限性: 1.对于大的文件(百万级.千万级的)同步耗时. 2.不能实时的检测,rsync是根据Linux守 ...

  4. Linux线程的同步,linux线程同步

    我是linux和linux线程的新手.我花了一些时间谷歌搜索试图理解可用于线程同步的所有函数之间的差异.我还有一些问题. 我找到了所有这些不同类型的同步,每个同步都有许多锁定,解锁,测试锁等功能. & ...

  5. linux rsync 目录同步,linux下使用rsync同步目录

    本文描述了linux下使用rsync单向同步两个机器目录的问题. 使用rsync同步后可以保持目录的一致性(含删除操作). 数据同步方式 1.从主机拉数据 备机上启动的流程 同步命令: rsync - ...

  6. linux服务器数据同步,Linux服务器数据定期同步和备份方式

    数据安全是做数据分析的人需要关注的一大问题.对于我们分析的关键数据.使用的关键脚本都需要定期备份. scp 最简单的备份方式,就是使用cp (本地硬盘)或scp (远程硬盘)命令,给自己的结果文件新建 ...

  7. linux 文件双向同步,Linux文件双向实时同步rsync

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 echo"/usr/sersync/sersync2-d-o/usr/sersync/confxml.xm ...

  8. linux 数据库数据同步,linux下mysql主从复制,实现数据库同步

    运行环境: 查看linux版本命令:lsb_release -a 主服务器:centos release 6.5 mysql 5.6.10-log  IP:172.17.200.25 从服务器:cen ...

  9. linux目录自动同步,linux 下面文件夹的自动同步 | Think in Drupal

    linux 下面文件夹的自动同步 我们有一个Drupal网站,里面放了很多客户的文档资源,用户希望能够从一个磁盘上,备份到另一个磁盘上,这两个磁盘都可以访问到. 安装rsync 安装inotify t ...

最新文章

  1. ActiviteX 服务
  2. CNCC技术论坛:后量子霸权阶段的量子计算
  3. svpwm仿真_三相三线逆变_并网仿真建模
  4. C语言之如何输出uint32_t和uint64_t和16进制
  5. 【机器学习】总结:线性回归求解中梯度下降法与最小二乘法的比较
  6. 飞鸽传书 获得磁盘的C#描述信息
  7. 多activity中退出整个程序
  8. linux usb设备名 ks,在Linux系统里识别USB设备名字的4种方法
  9. mysql linux 中文乱码怎么解决_如何解决mysql linux 中文乱码的问题
  10. ios中input输入无效
  11. 关于Executors.newFixedThreadPool何时创建新线程
  12. LINUX访问WINDOWS网络共享目录
  13. 电阻电容封装选型经验详解
  14. 快速部署Redis集群
  15. 加装ssd固态硬盘基本要求
  16. 免费PPT模板下载(不定时更新)
  17. Primitives vs Objects
  18. 2022年上海市安全员C证考试内容及上海市安全员C证考试技巧
  19. jkd动态代理源码分析
  20. 办公系统租用云主机建站用云主机

热门文章

  1. oracle 判断数值为小数位数为一位且为0_Python的循环、判断和各种表达式(长文系列第二篇)...
  2. maven的pom文件解析及配置
  3. 【译】 WebSocket 协议第十章——安全性考虑(Security Considerations)
  4. vue cli 解决跨域 线上 nginx 反向代理配置
  5. 实验四恶意代码分析技术 201421430029
  6. ThinkPHP 接入 SeasLog 日志组件
  7. 岁月的脚步,被时间冲刷——如何修复EM ?
  8. 【NetApp】exportfs命令的使用
  9. 怎样使绝对定位的子元素铺满父元素并且子元素可以设置padding
  10. CXF之jaxws:endpoint对spring bean的引用