信号处理,信号队列

进程间通信(信号、消息队列、共享内存、信号量) 信号(signal)是一种软件中断,是UNIX系统中最为古老的进程之间的通信机制。用于在一个或多个进程之间传递异步信号。它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式。在Linux中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据。... 阅读详情

最近几天在看信号,对实时信号的实时性不是很理解,今天看了下 __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;
	}
}

参考了下面的文章,但是他里面没有取信号的讲解,所以写文章补充下。

 

参考:http://kernel.meizu.com/linux-signal.html

sigprocmask 函数深度解析 初始化信号集// 或 sigfillset(&set)错误检查// 错误处理资源清理/* 操作 */// 恢复配合 sigsuspend// 配置 wait_mask...// 原子等待线程环境// 使用 pthread_sigmask是信号控制的核心枢纽,理解其参数机制和与其它信号函数的协作关系,是编写健壮 Linux 系统程序的关键基础。 阅读详情

相关推荐

Linux编程细节:内核中的信号处理

通过注册信号处理函数,我们可以捕获并处理不同类型的信号。此外,我们了解了信号队列的概念,并演示了如何获取当前被阻塞的信号集。在上述示例中,我们使用sigprocmask()函数将SIGINT信号添加到信号集中,并将它们阻塞。在上述示例中,我们使用sigpending()函数获取当前被阻塞的信号集,并使用sigismember()函数遍历信号集,判断每个信号是否被阻塞。当信号被阻塞时,它们将被添加到队列中,并在解除阻塞后逐个递送给进程。其中,signum是信号的编号,handler是用户定义的信号处理函数。

EgwEditor的博客 74

Linux 信号signal

1 ctrl -c 只能给前台程序发送信号 而一个命令+& 表示将这个命令的进程放到后台运行,这样shell就不用等待就可以执行别的命令,启动新的进程。 2 shell可以运行一个前台进程和任意多的后台进程,但只有前台进程才能接收到类似于ctrl+c这种控制键产生的信号 3 前台进程运行中,用户可以随时用ctrl+c这样的控制键发送信号,也就是说,进程的用户空间代码执行到任何地方都有可能...

快乐星球 427

智能座舱音频系统集成与调试:从芯片选型到音质优化实战

在智能座舱域控制器架构中,音频系统已从简单的功放加扬声器演进为SoC、数字音频总线、外部DSP与多通道功放协同的复杂子系统。TDM总线的时隙分配、PDM麦克风阵列的信号完整性,以及AEC回声消除算法如何与硬件协同,直接决定多音区体验和语音交互的可靠性。工程实践中,音频调试的关键在于先理顺供电、接地、时钟与数据路由,再针对功放削波、采样率失配、TDM slot错位等典型问题进行系统性排查。从芯片选型到系统级指标验收,只有将音频链路视为整车电子电气架构的一个协同整体,才能真正实现从“响”到“好听”的跨越。本文结

weixin_30162121的博客 364

信号集

1. 信号集: sigset_t set; //typedef unsigned long sigset_t int sigemptyset(sigset_t *set) // 将某个信号集清0 int sigfillset(sigset_t *set) ...

weixin_30569153的博客 190

Java课程设计——扫雷游戏程序

使用Java语言对扫雷游戏的复刻

m0_60671275的博客 3497

浅谈云计算01 | 云计算服务的特点

在当今数字化时代,云计算作为一种强大的技术解决方案,正逐渐改变着企业和个人对信息技术的使用方式。本文将详细探讨云计算的五个主要特点,包括按需自助服务、广泛的网络接入、资源池化、快速弹性伸缩以及可计量服务。

时光札记 1119

Linux高级编程——进程通信(信号signal)

进程间通信(IPC,Inter-Process Communication) 两个或多个进程间进行数据传送,参与通信的这些进程可能位于同一台机器上,也可能位于不同的机器上。 常用 IPC 方式: 信号(Signal) 管道(Pipe) 共享内存(Shared Memory) 消息队列(Message Queue) 套接字(Socket) 信号(Signal) Linux 系统上古老经典的 IPC方式,主要用于实现异步通知,不能传输数据。 信号是一种软件中断(Software Break) void (*

琛翀的风暴空间 2072

FPGA打砖块游戏设计(有上板照片)VHDL

这是一款经典打砖块游戏,我们的努力让它更精致更好玩,我们将它取名为打砖块游戏(Flyball),以下是该系统的一些基本功能: 画面简约而经典,色彩绚丽而活泼,动画流畅 玩家顺序挑战3个不同难度的级别,趣味十足 计分功能,卡通字母数字 4条生命值,由生命条显示 游戏结束画面,缓缓浮起与缤纷刷色的特效 四键操作,可复位,可暂停,高灵敏 96块砖拼出可爱的“囧”字,方便更改 碰挡板非镜面反射 初始启动,随机的发射速度。

QQ_778132974的博客 1660

信号处理以及队列

这个示例展示了如何使用信号处理程序将信号放入队列中,并在主循环中处理这些信号。这个示例展示了如何有效地使用队列来处理信号,从而避免在信号处理程序中执行复杂的逻辑。信号处理程序:当接收到信号(如SIGINT或SIGTERM)时,信号处理程序会将信号放入一个线程安全的队列中。按 Ctrl+C 或发送 SIGTERM 信号(例如使用 kill 命令)来触发信号处理程序。主处理函数:在一个单独的线程中,主处理函数定期检查队列,并处理所有待处理的信号。互斥锁:使用互斥锁确保对队列的访问是线程安全的。

weixin_42692164的博客 819

Android11车机系统海外项目资源包RRO方案优化

本文介绍了汽车设置应用如何通过Android RRO(运行时资源叠加)方案实现多车型差异化资源管理。针对不同车型(国内/海外、轿车/SUV)和配置(方向盘、轮毂等),采用产品变体(productFlavors)构建不同APK版本,并通过JSON配置文件动态启用对应资源包。系统根据车辆下线配置自动匹配适用的资源叠加包,解决了硬编码判断带来的维护问题。该方案实现了资源的高效复用,同时支持灵活配置多种车型组合,为汽车行业多车型共平台开发提供了可扩展的技术实现。

shusuanly的博客 469

18、探索隐私工程技术的前沿:从理论到实践

本文深入探讨了隐私工程技术的核心概念、关键技术及其应用场景,分析了加密技术、访问控制和用户界面设计等在隐私保护中的作用,并结合数据库保护、物联网设备等实际场景进行阐述。同时,文章还讨论了隐私工程技术面临的挑战与未来发展趋势,提出了数据最小化原则、差分隐私、隐私增强技术等优化策略以及隐私设计、隐私影响评估等最佳实践,最后展望了新兴技术对隐私保护的影响及法规推动下的发展方向。

weixin_35307279的博客 373

学习_vfork、消息队列和信号处理小小程序

因为自己写的小程序,结构不太严谨

codeor的专栏 587

基于RK3588边缘计算平台的人数统计系统设计与实现

针对人数统计场景优化的YOLOv5模型完整的模型转换和部署流程高效的嵌入式推理优化方案低成本、低功耗的部署方案实时性强,满足工业应用需求可扩展性好,适配多种应用场景引入注意力机制,提高小目标检测能力结合多模态信息,增强系统鲁棒性开发可视化管理平台,提升用户体验随着边缘计算和AIoT技术的快速发展,基于深度学习的智能视觉系统必将在更多领域发挥重要作用。本项目为相关应用的开发和部署提供了有价值的参考,为推动人工智能技术的产业化应用做出了积极贡献。

LXY_LOVE36的博客 145

GLM-OCR保姆级教程:模型服务优雅关闭(SIGTERM信号处理+请求队列 draining)

本文介绍了如何在星图GPU平台上自动化部署GLM-OCR镜像,实现文档识别与处理服务。该平台支持一键部署,结合优雅关闭机制确保服务可靠性,典型应用于企业文档数字化、表格识别等场景,提升自动化处理效率。

weixin_42453228的博客 1075

使用cmd命令查看电脑是不是翻新机 如何查看自己电脑是不是翻新机

最近pdd啥的百亿补贴啊,什么品牌店啊,很多“假一赔十”,绝对“正品”都蹦出来了,很多人拿到以后,也上网查了各种鉴别方式,包括区分是不是翻新机之类的。本人亲自踩坑“pdd品牌店”,“假一赔十”,“绝对正品”等店铺,跟大家分享一下我得鉴别经验(说道分享鉴别经验了,大家也就不用好奇了,我肯定是买到翻新机了,mmp)。 第一步:准备好手机,开始录屏,没有完整的拆箱视频,可能不容易退货退款 第二步:拆箱,查看屏幕划痕(用手机闪光灯看,要不然看不清),然后查看屏幕有没有被擦过的痕迹 第三步:查看USB孔等插口有没有划

weixin_39417324的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

linux内核中的信号机制--信号处理

linux内核中的信号机制--信号处理Kernel version:2.6.14CPU architecture:ARM920TAuthor:ce123(http://blog.youkuaiyun.com/ce123) 当进程被调度时,会调用do_notify_resume()来处理信号队列中的信号。信号处理主要就是调用sighand_struct结构中对应的信号处理函数。do_notify_resume(

ce123的技术博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

dianping_spider 爬虫异常排查全指南:大众点评反爬触发场景、日志解读与修复方案

本指南以开源爬虫项目 dianping_spider(大众点评全站爬虫,解决动态字体加密)官方问题文档 [docs/problems.md](https://link.gitcode.com/i/4b045cdb2b7c0f0bc2089a62d9a84b5d) 为主体,系统梳理项目运行时可能遇到的 12 类典型故障——从 SSLError、人机验证码、请求被 ban,到 cookie 失效、字体

gitblog_01137的博客 488

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Linux 进程间通信与信号机制详解:管道、消息队列、共享内存和信号处理

本文系统梳理 Linux 中常见的进程间通信与信号机制,重点介绍管道、命名管道、消息队列、共享内存和信号的基本概念、适用场景与典型特点,并对 kill、signal、sigaction 等常用接口进行了说明。通过横向对比不同机制的通信方式与使用代价,帮助读者建立对 Linux 进程协作与异步通知机制的整体理解。

2301_80117992的博客 360

使用C语言进行信号处理:从理论到实践的全面指南

信号是由操作系统产生的软件中断,用于通知接收进程发生了某些类型的事件。不可忽略的信号:如SIGKILL和SIGSTOP,它们总是会被操作系统强制执行。可忽略的信号:如SIGINT和SIGTERM,接收进程可以选择忽略或者自定义处理。信号编号描述SIGINT2终端中断信号,通常由用户按下Ctrl+C触发。SIGTERM15终止信号,通常用于请求程序优雅地停止运行。SIGKILL9强制终止信号,无法被捕捉或忽略。SIGALRM14。

极客代码 1730

Linux信号处理的相关数据结构和操作函数

这篇文章摘要如下: 本文详细分析了Linux内核中信号处理的三个关键机制:1. has_pending_signals()函数用于检测是否存在未阻塞的待处理信号,通过位运算比较信号集;2. recalc_sigpending()函数重新计算信号状态,检查三种条件(进程组停止、私有信号、共享信号)来设置/清除TIF_SIGPENDING标志;3. refrigerator()实现进程挂起功能,将进程状态设为不可中断并进入调度循环。这些机制共同构成了Linux内核信号处理的核心框架,涉及信号检测、状态管理和进程

weixin_51019352的博客 843

UNIX IPC: POSIX 消息队列 与 信号

POSIX消息队列可以注册空队列有消息到达时所触发的信号,而信号触发对应的信号处理函数。 下面是一份基本的消息队列和信号处理结合的代码(修改自UNIX网络编程:进程间通信) #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h&gt...

weixin_30466039的博客 78

LabVIEW声音信号处理:如何用消息队列优化采集系统的性能?

本文深入探讨了如何利用消息队列优化LabVIEW声音采集系统的性能。通过将采集、处理与显示任务解耦,构建异步并发的架构,有效解决了传统顺序式编程导致的界面卡顿、数据丢失等问题。文章详细阐述了消息队列的核心组件、系统骨架搭建、性能优化技巧及高级应用模式,为开发高性能、高可靠性的实时声音信号处理系统提供了完整方案。

f6g7h8i9j的博客 429

linux通过信号回调函数,信号机制的管理结构 - Linux内核中的信号机制_Linux编程_Linux公社-Linux系统门户网站...

信号只是一个数字,数字为0-31表示不同的信号,如下表所示。编号信号名默认动作说明1SIGHUP进程终止终端断开连接2SIGINT进程终止用户在键盘上按下CTRL+C3SIGQUIT进程意外结束(Dump)用户在键盘上按下CTRL+\4SIGILL进程意外结束(Dump)遇到非法指令5SIGTRAP进程意外结束(Dump)遇到断电,用于调试6SIGABRT/SIGIOT进程意外结束(Dump)7S...

weixin_42407741的博客 351

linux 信号优先级,linux内核中的信号机制

linux内核中的信号机制--信号处理Kernel version:2.6.14CPU architecture:ARM920TAuthor:ce123(http://blog.youkuaiyun.com/ce123)当进程被调度时,会调用do_notify_resume()来处理信号队列中的信号。信号处理主要就是调用sighand_struct结构中对应的信号处理函数。do_notify_resume()...

weixin_34696080的博客 835

inux内核中的信号机制--信号处理

https://blog.youkuaiyun.com/ce123_zhouwei/article/details/8570616   Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blog.youkuaiyun.com/ce123) 当进程被调度时,会调用do_notify_resume()来处理信号队列中的信号。信号处理...

eric43的专栏 798

linux进程管理之信号处理

------------------------------------------ 本文系本站原创,欢迎转载! 转载请注明出处:http://ericxiao.cublog.cn/ ------------------------------------------

884
上一篇: virtio_vring_index里的guest_index和host_index分析
下一篇: qemu 信号线程化
wllabs
博客等级 码龄16年 21粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值