
信号处理,信号队列
发布日期:2021-09-16 04:36:44
浏览次数:2
分类:技术文章
本文共 1556 字,大约阅读时间需要 5 分钟。
最近几天在看信号,对实时信号的实时性不是很理解,今天看了下 __dequeue_signal 差不多理解了,一个实时信号可以有多个实时队列,在signal集合里一个signal可能有多个signal队列。
信号,有信号队列,有信号集
sigpending是信号pending的结构体,里面有sigqueue的链表,和signal的一个集合,这个集合,实际是一个 unsigned long 64位的类型的值,所以也可以这个也限制了信号的数据,也只能支持64个信号。
typedef unsigned long sigset_t; struct sigpending {
struct list_head list;
sigset_t signal;};
__dequeue_signal 取出信息
static int __dequeue_signal(struct sigpending *pending, sigset_t *mask,
siginfo_t *info){
int sig = next_signal(pending, mask);
if (sig) {
if (current->notifier) {
if (sigismember(current->notifier_mask, sig)) {
if (!(current->notifier)(current->notifier_data)) {
clear_thread_flag(TIF_SIGPENDING);
return 0;
}
}
}
collect_signal(sig, pending, info);
}
return sig;}
colloct_signal 收集信号,如果存在二个的队列,则不从signal里删除对应sig比特位
static void collect_signal(int sig, struct sigpending *list, siginfo_t *info){
struct sigqueue *q, *first = NULL;
/*
* Collect the siginfo appropriate to this signal. Check if
* there is another siginfo for the same signal.
*/
list_for_each_entry(q, &list->list, list) {
if (q->info.si_signo == sig) {
if (first)
goto still_pending;
first = q;
}
}
sigdelset(&list->signal, sig);
if (first) {still_pending:
list_del_init(&first->list);
copy_siginfo(info, &first->info);
__sigqueue_free(first);
} else {
/*
* Ok, it wasn't in the queue. This must be
* a fast-pathed signal or we must have been
* out of queue space. So zero out the info.
*/
info->si_signo = sig;
info->si_errno = 0;
info->si_code = SI_USER;
info->si_pid = 0;
info->si_uid = 0;
}}
参考了下面的文章,但是他里面没有取信号的讲解,所以写文章补充下。
参考:
转载地址:https://blog.csdn.net/wllabs/article/details/108740887 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.249.68.14]2022年05月22日 15时38分52秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
最新文章
MySQL实现Oracle的rank over(partition by...order by)叠加start with...connect by...prior...函数
2019-12-29 10:43:40
接口和抽象类之间的区别
2019-12-29 10:43:38
java的八大数据类型
2019-12-29 10:43:39
java中的List,Map,List<Map>
2019-12-29 10:43:39
类的加载生命周期
2019-12-29 10:43:39
用PyQt5开发桌面端数据库管理工具
2019-12-29 10:43:39
基于C++简易JSON解析器
2019-12-29 10:43:39
优化C++制作的简易密码管理工具
2019-12-29 10:43:39
转圈算法
2019-12-29 10:43:37
上班人员必读:“五险一金”详解!(转载)
2019-12-29 10:43:38
c++尝试写一个代理类
2019-12-29 10:43:38
WebLogic 下载 配置
2019-12-29 10:43:38
OSI参考模型
2019-12-29 10:43:38
信道特征(码元、比特、波特率等概念)
2019-12-29 10:43:38
C++动态分配指针数组
2019-12-29 10:43:36
平衡二叉树的简单建立--示例
2019-12-29 10:43:36
unity3d小插件之查找结点路径并自动写入到剪贴板
2019-12-29 10:43:36
c#中实现的万能变量类
2019-12-29 10:43:37
计算机中数据的存储形式
2019-12-29 10:43:37
NGUI的UITweener动画注意事项
2019-12-29 10:43:37