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

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

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.249.68.14]2022年05月22日 15时38分52秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章