信号处理,信号队列
发布日期:2021-09-16 04:36:44
浏览次数:21
分类:技术文章
本文共 1601 字,大约阅读时间需要 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月12日 06时21分52秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【大话Mysql面试】-Mysql常见面试题目
2019-04-26
08 【多线程高并发】Java线程间通信的方式
2019-04-26
【数据结构与算法】什么是跳表?通俗易懂来理解跳表
2019-04-26
【数据结构与算法】什么是图?图是什么?快速带你回顾图有关的知识点
2019-04-26
【数据结构与算法】什么是串?什么是KMP算法?字符串匹配是什么?
2019-04-26
【数据结构与算法】什么是布隆过滤器?如何防止缓存穿透的问题?
2019-04-26
【面试题目】Java设计模式你有哪些了解?说几个常用的。
2019-04-26
【计算机操作系统】常说的死锁是什么?死锁产生的必要条件是什么?死锁的解决策略是什么?
2019-04-26
【计算机操作系统】设备管理?磁盘结构是怎么样的?磁盘调度算法有哪些?
2019-04-26
【多线程高并发】为什么要使用多线程?创建多少个线程合适呢?
2019-04-26
【多线程与高并发】 Java两个线程轮流打印1-100两个数?多线程轮流打印数字?
2019-04-26
【多线程与高并发】 Java两个线程轮流打印字符串?
2019-04-26
【Linux命令篇】Linux命令实践
2019-04-26
【Leetcode单调队列】Leetcode239 滑动窗口最大值
2019-04-26
【Leetcode-单调栈】单调栈相关的题目-下一个更大的元素I 每日温度
2019-04-26
【Leetcode单调队列】- 洛谷P1714切蛋糕
2019-04-26
【Leetcode优先级队列】- 数据流的中位数
2019-04-26