linux 信号相关的知识

将pytroch模型转为paddlelite模型并集成到android程序中 在android中使用paddlelite加载yolov5模型识别opencv读取的摄像头信息 阅读详情

信号

信号的共性:

  1. 简单
  2. 不能携带大量的信息
  3. 要满足条件了才可以发送

信号的特质:

  1. 信号是软件层面的“中断”

    一旦信号产生,无论程序执行到了什么位置,必须立刻停止运行,来处理信号,之后再继续执行指令

  2. 所有的信号的产生和处理均是由内核产生和处理的

信号相关的事件和状态

信号的产生:

  1. 按键产生 Ctrl + c
  2. 系统调用产生 kill, raise
  3. 软件条件产生 alarm
  4. 硬件异常产生 段错误
  5. 命令产生 kill

递达: 传递且到达进程

未决: 产生和递达直接的状态, 由于阻塞所导致

信号的处理的方式:

  1. 执行默认动作
  2. 忽略
  3. 捕捉(调用用户处理函数)

阻塞信号集:

  • 将集合中的信号进行屏蔽, 若收到了该信号, 则会将其处理推后

未决信号集:

  • 信号产生时, 该信号集中的信号设置为1, 当信号处理后,设置为0
  • 若该信号被屏蔽, 则为解除前, 该信号一直为未决状态

常见信号:

9). SIGKILL 无条件终止进程,无法被忽略,处理和阻塞

19). SIGSTOP 停止进程, 无法被忽略,处理和阻塞

10). SIGUSR1 用户自定义信号, 默认为终止进程

12). SIGUSR2 用户自定义信号, 默认为终止进程

17). SIGCHLD 子进程的状态发生变化的时候,用于通知父进程, 默认为忽略

kill函数

int kill(pid_t pid, int sig);
参数:
	pid
		>0 : 把信号发送给指定的进程
		=0 : 把信号发送给与调用kill函数相同进程组的所有的进程
		<0 : 取|pid|发给对应的进程组(进程组的id和父进程的id是一样的)
		== -1 : 发送给进程有权限发送的系统中的所有的进程
返回值:
	成功: 0
	失败: -1, 设置errno

raise函数

int raise(int sig);

等价于

kill(getpid(), sig);

abort函数

void abort(void);

用于终止进程

alarm函数

作用: 定时发送SIGALRM信号给进程(自然计时法 --- 无论进程处在什么状态, 始终计时)
unsigned int alarm(unsigned int seconds);
参数:
		seconds: 定时的时间
返回值:
		上次剩余的时间,
		无错误现象

time命令: 查看程序执行的时间

实际时间 = 用户时间 + 内核时间 + 等待时间 -> 优化瓶颈在IO

setitimer/getitimer函数

int getitimer(int which, struct itimerval *curr_value);

int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
参数: 
		which: 指定定时方式
				1. 自然定时: ITIMER_REAL	-> SIGALRM
				2. 虚拟空间计时(用户空间): ITIMER_VIRTUAL	-> SIGVTALRM
        3. 运行时计时(用户 + 内核): ITIMERR_PROF	-> SIGPROF
		
		new_value: 定时秒数
		old_value: 传出参数, 上次定时剩余时间
		
返回值:
		成功: 0
		失败: -1, 设置errno
		
		
struct itimerval {
               struct timeval it_interval; 周期定时的秒数
               struct timeval it_value;    第一次计时的秒数
           };
           
struct timeval {
               time_t      tv_sec;         /* seconds */
               suseconds_t tv_usec;        /* microseconds */
           };

信号集操作函数

总共有两个信号集, 一个是阻塞信号集, 一个是未决信号集, 可以操作阻塞信号集从而来间接影响未决信号集

sigset_t set: 自定义信号集

int sigemptyset(sigset_t *set);				清空信号集

int sigfillset(sigset_t *set);				全部阻塞

int sigaddset(sigset_t *set, int signum);	在一个信号集中阻塞一个信号

int sigdelset(sigset_t *set, int signum);	在一个信号集中不阻塞一个信号

int sigismember(const sigset_t *set, int signum);		判断一个集合是否被阻塞
返回值:
		被阻塞了: 1
		没有被阻塞: 0
		失败: -1

设置信号屏蔽字:

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
参数:
		how:
        SIG_BLOCK:		设置阻塞
        SIG_UNBLOCK:  取消阻塞
        SIG_SETMASK:	用自定义的set替换mask
		
		set:自定义的set
		lodset:旧的mask, 传出参数
返回值:
		成功: 0
		失败: -1

查看未决信号集

int sigpending(sigset_t *set);
参数:
		set: 传出参数, 未决信号集

信号的捕捉

signal函数

函数指针

函数返回值类型 (* 指针变量名) (函数参数列表);

函数指针类型

typedef 函数返回值类型 (* 指针变量类型名) (函数参数列表);

作用: 用于 注册 一个信号捕捉函数(执行依然是内核)
sighandler_t signal(int signum, sighandler_t handler);
参数:
		signum: 信号的数字
		handler: 一个函数指针, 指向的是一个形参为int, 返回值为void的函数
返回值:
		handler

typedef void (*sighandler_t)(int);

sigaction函数

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
参数:
		signum: 信号的编号
		act: 新的动作
		oldact: 旧的动作

struct sigaction {
    void     (*sa_handler)(int);// 设置回调函数
    		1. 捕捉函数名
    		2. SIG_IGN表示忽略
    		3. SIG_DFL表示执行默认动作
    
    void     (*sa_sigaction)(int, siginfo_t *, void *);		// 传递的参数, 要传参数的时候
    sigset_t   sa_mask;										// 设置sa_handler函数工作的时候mask的值
    int        sa_flags;									// 设置属性值
    		0: 默认动作
    		SA_RESTART: 被中断的时候重启
    		SA_SIGINFO: 使用sa_sigaction来指定捕捉函数
    		SA_DEFER: 不自动屏蔽信号
    		SA_INTERRUPT: 系统调用被信号中断后,不重启
    		
    void     (*sa_restorer)(void);
};

信号捕捉的特性

  1. 当一个捕捉函数捕捉到了一个信号以后, 当调用该函数的时候, 信号屏蔽字由sa_mask决定, 不由原来的信号屏蔽字决定, 调用完了以后, 则恢复成原来的信号屏蔽字
  2. XXX 信号捕捉函数期间, XXX信号会自动被屏蔽
  3. 阻塞的常规信号不支持排队, 产生多次, 只执行一次

sigchld 信号

sigchld的产生的条件

  1. 子进程终止时
  2. 子进程接收到SIGSTOP信号停止时
  3. 子进程处在停止态, 接受到SIGCONT后唤醒时

编程技巧

如何防止子进程在捕捉函数注册前就已经死掉?

  • 在捕捉函数注册完成以前,将信号屏蔽起来

如何防止僵尸进程的出现?

  • 使用循环来回收子进程, 一次捕捉, 多次回收 while ((wpid = waitpid(-1, &status, 0)) != -1);

慢速系统调用

  • 可能造成进程永久堵塞的系统调用叫慢速系统调用, 如read, wait, waitpid
被中断的行为
  1. 中断系统调用的信号不能被屏蔽, 忽略, 必须被捕捉
  2. 中断后返回-1, 设置errno为EINTR
  3. sa_flags
    1. SA_RESTART 重启
    2. SA_INTERRUPT 不重启
手把手拆解DGX GB200 NVL72:1个机柜如何塞进72块GPU?详解NVLink Switch铜缆背板设计 本文深度解析英伟达DGX GB200 NVL72系统如何通过NVLink Switch铜缆背板设计,在标准42U机柜中集成72块B200 GPU,实现1800GB/s的超高带宽。文章详细介绍了模块化架构、铜缆互连技术、液冷散热方案和高密度供电系统等核心创新,为AI算力需求提供突破性解决方案。 阅读详情

相关推荐

MemSeg:一种差异和共性来检测图像表面缺陷的半监督方法

本文认为人为创建类内差异和保持类内共性可以帮助模型实现更好的缺陷检测能力,从而更好地区分非正常图像。如图一所示。差异(differences):MemSeg引入人工模拟的异常图像在训练阶段使模型能够区分正常和异常的图像,减轻了半监督学习只能用正常样本进行训练的不足,然后在推理阶段可以直接输入图像无需做任何后处理。共性(commonalities):MemSeg引入了一个记忆池来记录正常样本的通用模式,在训练和推理阶段,比较输入图像和记忆池中的样本之间的差异,为异常区域的定位提供有用的信息。

斯人若彩虹,遇上方知有! 4841

kill 命令信号全解

$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGC.

田振靓的博客 1万+

OpenClaw 聪明设置指南(真实可用方案)

本文介绍了OpenClaw AI系统的配置与优化指南,主要内容包括:1)基础配置,涵盖初始化流程、安全设置和配置文件位置;2)模型分层策略,推荐主力模型与降级方案;3)性能优化,包括推理加速和内存管理;4)智能提升方法,如人格定义和技能安装;5)高级功能如多Agent协同和Token优化。文章提供了详细的配置命令和参数说明,帮助用户根据需求平衡性能与成本,实现高效AI助手部署。

qq_43344878的博客 711

Linux SIGUSR1和SIGUSR2 捕获

linux提供了2个用户自定义信号: SIGUSR1 默认处理:进程终止 SIGUSR2 默认处理:进程终止 test.c #include &lt;stdio.h&gt; #include &lt;signal.h&gt; void handler(); int main(int argc, char ** argv) { sigset( SIGUSR1 , handl...

混沌的博客 1万+

ANSYS 12.1避坑全记录:当Win7+VMware14遇到FLEXlm报错时的自救指南

本文详细介绍了在Windows 7和VMware14环境下安装和运行ANSYS 12.1时遇到的FLEXlm报错问题及其解决方案。通过虚拟机技术隔离时间同步问题,提供从环境配置到许可证管理的完整指南,帮助用户稳定运行这一老旧版本的工程仿真软件。

tt34567的博客 644

基于PLC1200与CB1241的RS485从站Modbus Rtu通信实战指南

本文提供了一份详细的西门子S7-1200 PLC与CB1241 RS485通讯板实现Modbus RTU从站通信的实战指南。内容涵盖从硬件接线、博途软件组态、关键参数设置到程序调试与测试的全过程,重点解析了Modbus_Slave指令配置与数据块映射,帮助工程师快速掌握工业自动化系统中的数据采集与设备接入技术。

Apple的专栏 796

Linux进程通信——信号(一)

signal.h。

2301_78772787的博客 4067

通达信烽火起爆指标公式

STICKLINE(IF(起爆666,-120,0),+33,0,3.4,0),COLOR007777;STICKLINE(IF(起爆666,-120,0),+33,0,1.8,0),COLOR009999;STICKLINE(IF(起爆666,-120,0),+33,0,1.2,0),COLOR00BBBB;STICKLINE(IF(起爆666,-120,0),+33,0,0.6,0),COLOR00DDDD;STICKLINE(起爆666,0,100,9999,0)*起爆,COLOR000000;

zhibiaogong的博客 3893

Linux的SIGUSR1和SIGUSR2信号

http://www.manongjc.com/article/62879.html

JustDoIt_201603的博客 1523

深度学习助力台风路径预测:技术剖析与实战应用全攻略(基于LSTM模型)

摘要:深度学习技术在台风路径预测领域展现出巨大潜力。通过融合多源气象数据,深度学习模型如LSTM能有效处理时间序列数据,捕捉台风路径变化规律。与传统方法相比,深度学习模型在自动特征学习和处理复杂模式方面具有独特优势,提高了预测的准确性和实时性。然而,挑战依然存在,包括数据质量问题、模型可解释性不足以及极端台风的复杂性。未来,随着观测技术的进步和新算法的开发,深度学习将在台风路径预测中发挥更大作用,为防灾减灾提供更精准的决策支持。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2229

史上最详细的sqlmap使用教程

sqlmapsqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入。目前支持的数据库有MySql、Oracle、Access、PostageSQL、SQL Server、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等Sqlmap采用了以下5种独特的SQL注入技术基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入。

大河之犬的博客 5万+

Linux系统编程——信号篇

本文是针对Linux System Programming书的信号篇进行的学习

m0_51451952的博客 364

部署与可视化系统:零基础到精通:LabVIEW 调用 YOLO 动态链接库(DLL)的保姆级视觉检测系统融合实战

LabVIEW与YOLO26深度集成:工业视觉检测新范式 本文揭示了LabVIEW与最新YOLO26模型深度集成的创新方案,通过C++封装ONNX Runtime为DLL,在LabVIEW中实现端到端视觉检测。核心突破点包括: 技术选型:对比YOLOv5/YOLOv8/YOLO26性能,YOLO26在CPU推理速度提升43%,支持NMS-Free端到端推理 部署架构:提供ONNX Runtime C++ API和TensorRT两种DLL封装路径,适配不同硬件环境 工程实现:详细展示从PyTorch模型导出

ZXSXJ的博客 284

【Linux】信号相关知识详细梳理

目录1. 信号概念 2. 信号的产生3. 信号处理4. 信号原理 4.1 理解信号行为4.2 重谈信号产生4.3 信号保存4.3.1 信号集4.3.2 信号集操作函数4.4 信号处理4.4.1 信号捕捉和处理 在 Linux 系统中,信号是一种用于进程间通信 (IPC) 的机制,可以用来通知进程发生了某些事件。信号是由内核或进程发送的,目标是终止、暂停、恢复或触发特定行为。 以下是一张信号表,可用 kill -l 命令查看: 在讲信号的产生前,首先看一个信号的例子:

fulufulucode的博客 1124

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux信号相关知识

信号的特质: 信号时软件层面的“中断”,一旦信号产生,无论程序执行到什么位置,必须立即停止运行,处理信号,处理结束,再继续执行后续指令.(故一般把信号的捕捉,放 在变量定义完后,如果放在某些指令之后(如while死循环后),程序都还没读到有信号捕捉,所以接受到信号不会捕捉,而是进行信号的默认处理) 所有的信号的产生和处理都是由内核来完成的。 1.产生信号的几种方式: 按键产生:ctrl+c ctrl+z ctrl+ 系统调用:kill(pid,sig) alarm( second ) 软件条件产生

P.L.C的博客 159

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux 信号相关知识

什么是Linux中的信号 信号实际上是软件中断, 信号的存在提供了一种处理异步事件的方法。 给进程发信号 实际上是给PDB的信号字段的 对应信号的二进制位置 1; 是让进程终止 。 信号可以让进程暂停。 信号是有有限种类的 有编号的。 本质上为什么kill -9 (进程id)命令 杀了一个进程 9号信号对进程的默认处理方式 进程即使在没有收到对应信号之前,也有默认的对每一...

Meliorem的博客 664

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Linux 信号相关知识

只为让自己能够不忘记。。。。。。 操作系统提供了一种标准的服务来让程序员实现对底层硬件和服务的控制(比如文件系统),叫做系统调用(system calls)。 信号本质:      软中断信号(signal,简称信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机

abcdyzhang的博客 507

【Linux】信号相关知识点整理

信号概念 是一个软件中断,通知进程发生了某件事情,中断进程当前操作,让进程去处理这个事件。 信号有很多种:62种信号,两大类型:可靠信号:34~64/非可靠信号:1~31.进程必须识别这些信号。 查看信号种类:kill -l kill杀死进程的原理:向进程发送信号--通知事件,让进程自己退出 信号生命周期:信号的产生--->在进程中注册--->在进程中注销--->...

swag_wg的博客 330

Linux | 信号量相关知识点

信号量:信号量(Semaphore)有时被称为信号灯,是解决并发问题过程中所使用的一种设施,可以用来保证两个或多个关键代码段不被并发调用。一个进程在进入一个关键代码段之前,进程(或线程)必须获取一个信号量;一旦关键代码段完成了,那么该进程(或线程)必须释放信号量。其它想进入该关键代码段的进程(或线程)必须等待直到第一个进程(或线程)释放信号量。 从并发机制的角度看,信号量是一种并发机制,它用于进...

H_Expect的博客 343

linux系统中的信号相关知识点概述记录

1、什么是信号 1.1、信号是内容受限的一种异步通信机制 (1)信号的目的:用来通信 (2)信号是异步的(对比硬件中断) (3)信号本质上是int型数字编号(事先定义好的) 1.2、信号由谁发出 (1)用户在终端按下按键 (2)硬件异常后由操作系统内核发出信号 (3)用户使用kill命令向其他进程发出信号 (4)某种软件条件满足后也会发出信号,如alarm闹钟时间到会产生S...

weixiao的博客 278

Linux相关概念和易错知识点(24)(认识信号、信号捕捉)

其中利用了回调函数的知识。其返回值是返回先前的handler的值,

SGlow0708的博客 781

linux信号处理相关知识

因为要处理最近项目中碰上的多个子进程退出信号同时到达,导致程序不当产生core的情况,今天我花了时间看了一些关于linux信号处理的博客。 总结一下:(知识未经实践) 1 1 linux信号分两种,一种实时信号(也叫可靠信号),一种非实时信号(也叫不可靠信号)。 2 2 实时信号之所以是可靠的,因为在进程阻塞该信号的时间内,发给该进程的所有实时信号会排队,...

weixin_30929295的博客 99

UNIX/Linux --信号相关知识

一、基本的概念     1、中断     中断概念:中止、暂停当前正在执行的进程,转而去执行其它的任务。     硬中断:来自硬件设备的中断     软中断:来自其它程序的中断          2、信号     信号是一种软中断,可以把他看作是进程与进程、内核与进程通信的一种方式,它为进程的异步执行,提供了技术支持。          3、常见的信号         SIGINT(2)  ...

李政的博客 165

Linux系统编程阶段:管道和信号相关知识及部分函数介绍。

Linux系统编程阶段:管道和信号相关知识及部分函数介绍。

wanghongshuai1的博客 451

linux线程相关知识学习笔记2——线程同步之信号量

前言:通过一个任务导入并分析线程同步的信号量。 1、任务:用户从终端输入任意字符,然后统计字符个数并显示,输入end则结束。 2、分析: 使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数。 3、信号量的使用及编程实现 #include <stdio.h> #include <string.h> #include <stdlib...

weixiao的博客 407

【linux系统编程】信号——信号保存+信号处理

这是一篇将近3w字的超长文章,是信号三部曲的第二部曲及第三部曲的集合,并且还包含以前没学过信号不能讲的知识这里都进行了补充。首先讲了信号保存,信号是如何保存的。然后讲了信号处理,以前说过信号是在合适的时候被处理,什么合适的时候?进程从内核态返回用户态的时候,那什么是用户态,内核态,进程什么时候去OS中执行代码的,进而将虚拟地址空间在做进一步的阐述。以及有关信号的一些接口和接口的使用,并且还阐述如果同一时间发送同类型的信号OS会做什么处理等等知识,以及可重入函数volatile关键字SIGCHLD信号相关知识

fight_p的博客 2104
上一篇: vim的使用笔记
下一篇: linux 进程组和会话和线程
ghost_him
博客等级 码龄6年 598粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值