【笔记】Linux应用编程的信号机制

golang 消息忽略 signal.Ignore(syscall.SIGHUP) 示例 目录 示例1:exec.Command 子进程调用 忽略消息 防止僵尸进程 示例2:管道调用中的 消息忽略 示例3:多个消息忽略 示例4:消息忽略 与 消息处理 同存 消息具体含义参考: 《golang signal 信号处理》https://blog.youkuaiyun.com/whatday/article/details/118650161 示例1:exec.Command 子进程调用 忽略消息 防止僵尸进程 func main() { flag.Usage = usage flag... 阅读详情

上一节的一点尾巴: 使用alarm+pause实现sleep功能

pause的作用是将内核挂起,减小资源使用。但是当接受到信号的时候就会被唤醒。

alarm(3);
pause();

等同于sleep(3);

alarm(3);
signal(SIGALRM , SIG_IGN);	//SIGNAL_ignore:处理方式,忽略这个信号	
pause();	

等同于不占用资源的while(1)


5.1 什么是信号

正式的程序都会接触信号的,我们学到这些内容是比较重要的。
学习一下api,并且理解信号。

【信号】信号是 内容受限的一种异步通信机制。 内容受限:只能发信号,不可以发字符、文字、图像等
信号的目的:用于通信。
信号的特点:异步性。
信号的本质:是int型数字编号。

信号给人的感觉像是 软件中断。发什么信号,怎么发,谁发,是完全不知道的。

信号的举例:
用户发出:CTRL+C kill 按键
内核发出:硬件发生异常后(比如除以0导致出错),操作系统内核发出信号
条件满足发出:如alarm时间到产生SIGALARM信号。管道读端关闭,尝试写会产生SIGPIPE信号

信号的接受者处理方法:
忽略信号
捕获信号 信号绑定一个函数
默认处理 当前进程没有明显的管这个函数,忽略信号或者终止进程


5.2常用信号
系统定义好的信号:
SIGINT 2 重要!CTRL+C送给前台的每个进程 Signal interrupt
SIGABRT 6 调用abort函数,进程异常终止
SIGPOLL 8
SIGIO 8 重要!指示一个异步事件 高级io提及
SIGKILL 9 重要!KILL -9 ,杀死一个进程的终极方法,他不能被拦截,但需要一定的权限。
SIGSEGV 11 无效存储访问时OS的信号。访问了不该访问的内容。
SIGPIPE 13 重要!管道和socket
SIGCHILD 17 重要!子进程终止,父进程收到这个信号就可以回收

没有事先定义好的信号有两个:
SIGUSR1 10
SIGUSR2 12 功能是由用户自己决定的


5.3 进程对信号的处理

signal() 函数
signal(int signum,handler)
处理方法 返回值也是sighandler_t处理方法,出错会返回SIGERR,没出错不变

注意sighandler_t可能找不到,这个时候去自己 typedef,man手册里面有,其实就是int

【用signal函数处理SIGINT信号】

include
int main()
{
	ptf(before while1)
	while(1)
	{

	}	
	ptf(after while1)	 	
	ret0;
}

//这个时候ctrl+C会接收SIGINT,默认情况是打断进程的执行,即终止进程。
我们有什么办法通过CTRL+C只打断while1呢?

【用signal函数绑定一个处理方法】。注意在不同linux发行版的 移植性不是很好,可能出问题。

inc
void fun(int sig)
{
	printf(处理signal: ? , sig)
}

int main()
{
	signal(SIGINT , 函数指针fun)
	ptf(before while1)
	while(1)
	{

	}	
	ptf(after while1)	 	
	ret0;
}

这个时候ctrl+C,程序不会终止,而是会打印出一句,处理signal:2!没法杀死他了嘿。kill -9或者关闭终端。
进程收到信号时候会执行fun函数。函数的参数就是signal编号。

这里的sig参数,因为与signal绑定了,他是为了100%保证没有错误。比如说多个信号绑定了这个函数。
类比:独立中断和共享中断。

关于处理方法
signal(SIGINT , SIG_DFL) 设置为默认处理。。。额好吧这一句是完全多余的
signal(SIGINT , SIG_IGN) 设置为忽略处理,ctrlC之后无效果,只好强制结束了
signal(SIGKILL , SIG_IGN) 不会成功的,kill在设计的时候指定了不可忽略。Invalid arguement!

signal有个问题,你要建立一个捕获函数的时候是有移植问题的,可能不兼容。
解决方式是使用sigaction(signum,const传参_结构体指针action,输出型参数_结构体指针action)
可以一次得到设置新的捕获函数和旧的捕获函数,也可以用NULL跳过其中的某一个设置。


6.1 Linux 高级IO
Linux一切皆是文件。
高级IO里面也是读文件和写文件,高级IO要解决一些复杂的问题

非阻塞IO

阻塞IO:放在旁边照顾后面的进程,这是LINUX内核的一个常态。
父进程阻塞,等待回收子进程,收到SIGCHILD就去回收子进程。
常见的 阻塞式:wait pause sleep;

阻塞式的好处:非常有利于系统的性能发挥,他是Linux系统设计的默认方式。让CPU时刻在工作状态下。

为什么要实现非阻塞?
阻塞式在多路io时候会遇到问题
比如我同时读鼠标、键盘。
我希望动了键盘来唤醒一个进程,但是设计成了阻塞式鼠标触发,这样我鼠标不动可能会卡一辈子。
这个过程称为多路IO!

实现非阻塞?方法有二:

O_NONBOCK打开文件 的时候设置
fcntl打开文件之后,对fd进行操作,对其添加一个NONBLOCK模式进去


6.2
程序读键盘 标准输入设备,stdin
程序读鼠标
程序读键盘和鼠标

1键盘

inc
main()
{
	ptf "before read"		//查看阻塞效果
	read(0 , buf , 2);
	ptf %s, buf;	
}

现象是卡在read那一句。只打印了read之前一句,他读fd 0 ,因为没有按键盘就没有读到东西,这样就进入默认阻塞了
写入abcd还不出,是因为LINXU是行缓冲的,按个回车才行。
按回车:读出的 是 ab

2鼠标

inc
main()
{
	int fd = open(鼠标设备文件)	//注意:鼠标不是标准输入,/dev/input/下去找 mouse,cat去测试
				cat测试的时候,晃一下鼠标就行,会出来好多乱码。
				乱码是二进制文件 以 cat字符格式输出造成的。
	ptf before
	read fd
	ptf %s,buf	
}

读出来的就是乱码。

3同时读键盘和鼠标
默认:东西没有的时候会被阻塞住,等待被唤醒
现在:鼠标键盘都可以被读到,但是用户会非常不爽,必须要配合,这样的设计时不合乎使用的。

inc
main()
{
	//读鼠标,ptf , 为了配合这个程序,读到这里必须动鼠标

	memset buf
	
	//读键盘,ptf, 为了配合这个程序,读到这里必须动键盘,顺序还不能反
}

阻塞式IO的困境:我的程序阻塞在了鼠标这里,想去读键盘就毫无反应。后面等待处理的键盘急得要死但是由于被坑了,但是也没有办法。软件没问题,问题就是阻塞式IO的缺陷依然存在。

signal的升级版:sigaction。


6.3 fcntl实现非阻塞

inc 
main
{
	//读键盘
	int flag = -1
	             = fcntl (0 ,F_GETFL);		//先获取原来的 flag,
	flag |= O_NONBLOCK		//原来的flag添加非阻塞
	
	fcntl(0 ,	 F_SETFL,	 flag);	
	   那个文件   设置flag   传参flag

	//这三步之后,0,也就是stdin就是非阻塞式的了
	read
	ptf	after;
}

运行之后立马出来,打印after,而且什么都没读出来。

读鼠标的话,open的时候直接加O_NONBLOCK就行了,很简单

鼠标+键盘:
before
读出鼠标:空的
读出键盘:空的
after
程序结束

这也不是最终想要的效果
改进:

	while(1)
	{
		memset buf,读鼠标ret = read()
		if (ret > 0 )
			ptf( %s,  buf)		//read返回值是读到的个数,读到>0就打印

		memset buf,读键盘ret = read()
		if(ret >0)
			ptf %s , buf
	}

准确的说,这样的性能不是特别好。非阻塞式虽然能实现,但是不如多路复用IO和异步IO。涉及到CPU的调度,有些难度后面再说。


6.5 IO多路复用

IO多路复用技术:应对一些阻塞式IO的问题
复习一下非阻塞式的缺陷:那就是必须轮询read+print,CPU不得空闲,是一种非常本质的缺陷。

于是我们引入了select() 和 poll()两个函数,他们是unix的两个派别引起的分歧,其思想一样,外部特征不一样。
IO多路复用原理
外部阻塞,内部非阻塞。

假设有A和B两个部分进行多路复用

循环(1)			//这里的循环用了一定的方法降低了CPU 使用资源
{
	A阻塞
	B阻塞  
}

[select的简单使用]

inc
main
{

fd_set myset;
fd = open鼠标

FD_ZERO(&myset)		先把他用宏清零,注意传的是指针
FD_SET( fd , &myset)
FD_SET (0 ,&myset)			//把我们的fd添加进select准备复用的列表里,然后就可以select了

struct timeval tm;
tm.tv_sec =10;
tm.tv_usec =10;			//超时时间定时10s 0us
 
	ret = select (  fd+1  , 	&myset ,	NULL , 	NULL,	 &tm);
		      nfds					超时时间
	if(ret < 0)
		error
	else if ret==0
		超时
	else			//大于0,意味着一路IO到达,在此处理我们列表里的鼠标或键盘
		if(FD_ISSET(fd, &myset))
			//处理鼠标
			memset;		read;		printf		

		if(FD_ISSET(0 ,&myset))	
			//处理键盘
			memset;		read;		printf		
}
 

7.2 线程
Linux中的线程是脱开于进程的,可以说是一种轻量级进程,是参与内核调度的最小单元
一个进程中可以有多个线程

【Eg:使用线程实现同步键鼠】

inc
void *func(void *arg)
{
	//辅程序(while1读鼠标)--子线程
}
	
main
{
	pthread_t th = -1;
		
	create_pthread( &th , NULL ,	 func , 	NULL  )
			  线程属性      函数	给线程的传参
	
	//主程序(while1读键盘)--父线程
	fd =open..mouse0
	...
	while1
}

编译要使用gcc xxx.c -lpthread 使用了链接库,不写的话会报链接错误。

Linux 信号基本概念(signal) 包含的头文件和辅助方法 #define _BSD_SOURCE #define _GNU_SOURCE #include <signal.h> #include <stdio.h> #include <string.h> #include <unistd.h> void /* Print list of sig... 阅读详情

相关推荐

国网DLT698.45协议——采集系统、数据交换(三)

物理层规定了通信单元或其他终端设备与多功能电表的通信接口,接口的物理与电气特性。常见的物理层传输方式有对于RS485、红外、载波通信等通信信道。将数据包装成可传输的帧格式。1、根据通信配置参数完成端口的初始化配置,通信状态初始化为准备接收状态,初始化相关计数器及缓冲区指针。2、链路层及控制子模块负责通信数据的收发控制,各类超时问题的处理。无通信数据接收时,定时初始化通信端口。3、完成协议帧的解析及应答。

一个bug是bug,多个bug能work 8050

golang signal 信号简介

1.1. 基本概念 信号是事件发生时对进程的通知机制。有时也称之为软件中断。信号与硬件中断的相似之处在于打断了程序执行的正常流程,大多数情况下,无法预测信号到达的精确时间。 因为一个具有合适权限的进程可以向另一个进程发送信号,这可以称为进程间的一种同步技术。当然,进程也可以向自身发送信号。然而,发往进程的诸多信号,通常都是源于内核。引发内核为进程产生信号的各类事件如下。 硬件发生异常,即硬件检测到一个错误条件并通知内核,随即再由内核发送相应信号给相关进程。比如执行一条异常的机器语言指令(除 0,引..

whatday的专栏 2435

淋巴结病理数字玻片读取与处理代码

Whole-slide images are generally stored in a multi-resolution pyramid structure. 首先安装openslide模块 pip install openslide-python import os.path as osp import openslide from pathlib import Path...

猫头军师兵书 1275

【操作系统】信号Signal超详解|捕捉函数

🔥❤️内核层与用户层就是不同级别的CPU访问权限。可以参考 Intel单核处理器的特权级别(Privilege Levels),也称为保护环(Protection Rings)。这种模式在操作系统中也存在,用于管理和限制不同层次的软件对硬件资源的访问权限。防止低权限的代码(如用户进程)直接访问高权限的资源(如操作系统内核),减少系统被恶意攻击。Level 0(环0)特权级别:最高级别的CPU权限,内核层(Kernel Mode)。访问权限:可以访问所有的硬件资源和执行所有的CPU指令。

代码兴国 2475

注意力机制模块:CA(坐标注意力)二次创新:融合深度可分离卷积,打造 CADS 模块

本文提出CADS模块,将坐标注意力(CA)与深度可分离卷积(DSC)深度融合,优化移动端AI部署效率。通过重构CA的计算范式,用深度卷积替代传统1×1卷积,在保持精度的同时显著降低计算开销。文章深入分析了CA的计算瓶颈和DSC的实际效率问题,详细阐述了CADS的设计原理与PyTorch实现,并提供了多组性能对比数据。该模块可直接应用于YOLO、UNet等主流模型,为移动端AI部署提供高效解决方案。

ZXSXJ的博客 96

【网络安全 | 渗透工具】Githack工具安装及使用教程详析

本文仅分享Githack工具基本安装及使用相关知识不承担任何法律责任。Git是一个非常流行的开源分布式版本控制系统,它被广泛用于协同开发和代码管理。许多网站和应用程序都使用Git作为其代码管理系统,并将其部署到生产环境中以维护其代码库。然而,在配置不当的情况下,可能会导致.git文件夹被直接部署到线上环境中,这可能会导致Git泄露问题。可通过githack下载泄露的Git存储库,以获取包含未加密密码、凭据和敏感信息的站点代码库。使用githack下载Git存储库的方法有两种。本文仅分享。

等风来 3万+

linux signal()教程,linux signal之初学篇

前言本博文只总结signal的应用,对signal的kernel实现暂不讨论。1. linux signal是什么?signal是linux提供的用于进程间通信的一种IPC机制。2. 如何发送signal来实现IPC?使用kill命令或kill函数可以发指定的进程发送signal。kill -0 pid,没有id为0的signal,通常这个命令仅仅是用来测试进程号为pid对应的进程是否存在;不过使...

weixin_39581099的博客 171

【图像超分】论文复现:Pytorch实现SRCNN!保姆级复现教程!提供完整代码和最优权重模型(x2、x3、x4)!科研级论文曲线图!计算平均PSNR和SSIM!代码Windows和Linux都可用!

由于很多同学反应没用过jupyter notebook,更习惯用pycharm项目的形式跑代码。于是,本文将用pycharm项目的形式,重新复现SRCNN!【图像超分】论文复现:新手入门!Pytorch实现SRCNN,数据预处理、模型训练、测试、评估全流程详解,注释详细,简单修改就可以训练你自己的图像数据,有训练好的模型下载地址,随取随用。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 4701

《操作系统实践-基于Linux应用与内核编程》第8章-利用QT开发GUI应用程序

内容参考《操作系统实践-基于Linux应用与内核编程》一书的示例代码和教材内容,所做的读书笔记。

小狗爱吃黄桃罐头的博客 1298

Windows配置L2TP/IPsec连接

Windows 系统的 L2TP/IPsec 功能,通过配置即可构建加密 VPN 通道。

m0_61806534的博客 1666

2024年游戏策划最新面试题及答案

1. **游戏策划**:负责游戏设计和开发的创意和技术过程。2. **主要职责**:设计游戏玩法、故事、角色、世界等。4. **游戏机制**:定义玩家如何与游戏世界互动的规则。13. **引人入胜的角色**:深入的背景故事、个性特征。3. **游戏平衡**:确保游戏公平、有趣且具有挑战性。7. **RPG特点**:角色发展、故事驱动、玩家选择。12. **关卡设计技巧**:挑战性、流动性、视觉引导。11. **游戏关卡设计**:创建游戏世界的不同阶段。5. **游戏循环**:玩家在游戏中重复的行为模式。

guo162308的博客 2319

Linux的信号机制

信号机制 信号机制是一种使用信号来进行进程之间传递消息的方法,信号的全称为软中断信号,简称软中断。信号的本质是软件层次上对中断的一种模拟(软中断)。它是一种异步通信的处理机制,事实上,进程并不知道信号何时到来。 在头文件&lt;signal.h&gt;中定义了64种信号,这些信号的名字都以SIG开头,且都被定义为正整数,称为信号编号。可以用“kill -l”查看信号的具体名称。 上图中编...

程序人生 7050

COMSOL有限元仿真深度指南:连接薄结构与实体结构(I)

COMSOL有限元仿真深度指南:如何在结构力学仿真中连接薄结构与实体结构?

忘了面孔的Batou 1万+

Linux信号机制

Linux信号是操作系统中用于进程间通信、处理异常等情况的一种机制。它是由操作系统向一个进程或者线程发送的一种异步通知,用于通知该进程或线程某种事件已经发生,需要做出相应的处理。每个信号都有一个名字。这些名字都以三个字符SIG开头。在头文件中,这些信号都被定义为正整数(信号编号)。没有一个信号其编号为 0。POSIX 标准信号(Standard Signals):这些是传统的 Unix 信号,包括SIGINT(通常由 Ctrl+C 产生)、SIGTERM(请求终止)、SIGKILL。

无敌岩雀的博客 1982

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

Linux 的信号机制

Linux 信号机制作为操作系统内核与进程之间的重要通信手段,为系统的稳定运行、进程间的协作以及错误处理提供了高效、灵活的方式。深入理解信号机制的原理、产生方式、处理流程以及应用场景,对于开发高质量、健壮的 Linux 应用程序具有至关重要的意义,能够帮助开发者更好地利用系统资源,优化程序行为,提高系统的整体性能和可靠性。

千千道的博客 1893

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深入解析Linux信号机制

摘要:信号是Unix/Linux系统中进程间通信的轻量级机制,通过内核异步通知进程特定事件发生。本文系统介绍了信号的核心概念、工作原理、编程实现及使用场景。信号具有异步性、简单性和低开销等特点,适用于终端交互、进程管理和异常处理等场景。文章对比了信号与其他IPC机制的差异,详细说明了信号的发送与处理实现,并强调了信号处理的安全性、阻塞机制及可能的丢失问题。最后指出信号适合简单事件通知,但需与其他IPC机制配合满足复杂需求。

弘羽 1112

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Linux 信号机制

进程可以定义一个函数来处理接收到的信号,并在该函数中执行特定的操作。例如,处理SIGTERM// 执行清理操作// exit(0);// 捕获 SIGTERM 信号while(1) {sleep(1);// 模拟进程持续运行。

qq_45797625的博客 1370

Linux信号机制全解析

Linux信号机制是进程间通信的重要方式,用于异步通知事件发生。文章系统介绍了信号的基本概念、常见类型(如SIGINT、SIGTERM)及其产生方式(硬件异常、kill命令等)。重点讲解了信号处理方法,包括signal()和sigaction()函数的使用,以及信号的阻塞与未决状态管理。通过示例代码演示了如何设置信号处理函数、阻塞信号等操作。最后总结了信号知识树状图并给出实践建议,如编写信号处理程序、实现定时器等练习,帮助读者深入理解Linux信号机制。

弘羽 1479

Linux信号机制探析--信号的处理

在 shell 脚本中,可以通过exit/bin/bashexit 42执行这个脚本后,# 输出 420通常表示成功执行。非 0表示错误,具体数值代表不同的错误类型。128 + 信号编号表示进程因信号被终止。通过检查,你可以判断上一个命令的执行结果并作出相应处理。

完颜振江 2052

Linux之信号机制

Linux的信号机制详解

qq_43707773的博客 1052

Linux环境:C编程之信号机制

Linux环境:C编程之信号机制信号概述什么是信号信号的来源进程对信号的处理常用信号signal 信号处理机制 信号概述 什么是信号 信号是进程在运行过程中,由自身产生或由进程外部发过来的消息,用整型常量表示,在头文件<signal.h>中定义了一系列宏表示不同的信号。 信号的来源 信号由内核产生,内核产生信号的情形有三种: 用户:用户能够通过输入 CTRL+c、Ctrl+\,或者是...

black_kyatu的博客 728

linux信号机制

linux信号机制  信号提供了一种通知进程系统事件发生的机制,它也是作为用户进程之间通信和同步的一种原始机制。在进程迁移的情况下,如何处理信号呢?这部分介绍了MOSIX系统对信号机制的处理。LINUX信号机制信号是异步的进程间通讯机制,是在软件层次上对中断机制的一种模拟。LINUX内核的信号机制符合POSIX.4的规定,这是

顺子的专栏 2651

【Linux】应用篇十三--信号机制

应用篇十三--信号机制一、信号机制二、常用信号三、信号相关命令四、信号发送无、定时器六、信号捕捉1、信号捕捉过程2、signal捕获函数3、sigaction捕获函数七、信号集和信号屏蔽1、信号集操作函数2、pause/sigsuspend函数 一、信号机制 概念:信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式 ,所有信号的产生及处理全部都是由内核完成的 信号的产生: 按键产生 系统调用函数产生(比如raise, kill) 硬件异常 命令行产生 (kill) 软件条件(比如被0除,访.

修成真的博客 3703

Linux信号机制:从入门到精通

想象一下,如果你正在专心写代码,突然有人拍了一下你的肩膀,这就类似于操作系统中的"信号"。信号是Linux系统中用于通知进程发生了某种事件的一种异步通信机制,就像操作系统给进程发送的"紧急短信"。信号的本质是软件中断,当进程收到信号后,会暂停当前工作,转而去处理这个信号,处理完后再回到原来的工作。这就像你接到一个紧急电话,处理完紧急事务后再回到之前的工作一样。

m0_74319933的博客 2013
上一篇: 【笔记】ARM裸机程序开发_part5
下一篇: java的socket实现一个九宫棋游戏
睡不醒的小泽
博客等级 码龄11年 1426粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值