博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IPC——线程信号问题
阅读量:6573 次
发布时间:2019-06-24

本文共 1143 字,大约阅读时间需要 3 分钟。

所有的线程共享相同的信号处理方式

主线程将SIGINT信号的处理方式设置为了捕获,那么所有的次线程共享这一处理方式,如果其中某个次线程改变了该信号的处理方式,那么所有的线程将共享这一改变。

回顾“信号屏蔽字”和“未决信号字”

作用

“信号屏蔽字”和“未决信号字”作用同进程信号,参考

修改信号屏蔽字函数

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set, int signum);

int sigdelset(sigset_t *set, int signum);

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

没有次线程时

此时整个进程只有一个主线程,整个进程的“信号屏蔽字”和“未决信号字”,就是主线程的“信号屏蔽字”和“未决信号字”。

有次线程时

每个次线程都有自己独立的“信号屏蔽字”和“未决信号字”,次线程的“信号屏蔽字”和“未决信号字”是从主线程的“信号屏蔽字”和“未决信号字”复制而来的,在复制时,

(1)次线程的“信号屏蔽字”会保留从主线程“信号屏蔽字”所复制的值。

(2)次线程的“未决信号字”会清空,也就是说不会保留所复制值。

如果次线程对某些信号有特殊的“响应需求”的话,可以自己调用如下函数,修改次线程自己的“信号屏蔽字”,以实现将某个信号打开或者屏蔽。

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set, int signum);

int sigdelset(sigset_t *set, int signum);

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

多线程时是如何响应信号?

(1)进程收到信号后,进程会找到某一个没有屏蔽该信号的线程去处理。这个信号找哪一个线程,由进程说了算。

(2)如果所有的线程都屏蔽了该信号的话,信号发生时,进程会将未决信号记录到某个线程的“未决信号字”中。同样的,找哪一个线程,由进程说了算。

(3)当线程收到进程判给它的信号后,而且如果该信号的处理方式还是捕获的话这个线程在运行时会被中断,然后去执行信号捕获函数,当信号捕获函数执行完毕后,才会返回被中断的线程,接着执行。

转载于:https://www.cnblogs.com/kelamoyujuzhen/p/9450668.html

你可能感兴趣的文章
电脑蓝屏代码攻略
查看>>
我的友情链接
查看>>
我来自CSDN
查看>>
windowns
查看>>
java分享第十七天-02(封装操作excel类)
查看>>
在mysql表中插入大量测试数据
查看>>
怎么给电脑设置IP地址和DNS地址,各系统设置IP/DNS几种方法
查看>>
java 面试题解惑二 到底创建了几个String对象?
查看>>
面试总结之 oop desing 之 The Strategy Pattern
查看>>
必 备 习 题 集 (一)
查看>>
第 三 十 四 天:二 阶 段 复 习(五)
查看>>
windows下批量部署简易脚本
查看>>
python爬虫入门—统计豆瓣电影评论词频
查看>>
mysql由于server-id相同而造成同步失败
查看>>
【LoadRunner技术讲座4】利用sitescope监测监控mysql
查看>>
IEnumerable中运用yield
查看>>
python 时间转换(day,hous,minute,second)
查看>>
网络布线线材用量计算公式
查看>>
查询当前数据库用户会话信息
查看>>
创建触发器的基本语法
查看>>