信号处理,信号队列
发布日期: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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:qemu 信号线程化
下一篇:virtio_vring_index里的guest_index和host_index分析

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.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锁体系】CopyOnWriteArrayList是什么?线程安全的arraylist是哪个? 2019-04-26
【面试题目】Java设计模式你有哪些了解?说几个常用的。 2019-04-26
【计算机操作系统】常说的死锁是什么?死锁产生的必要条件是什么?死锁的解决策略是什么? 2019-04-26
【计算机操作系统】进程管理详解?进程与线程区别是什么?进程调度的算法有哪些?进程通信有哪些? 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