首页 > 其他分享 >【视频笔记】408新增知识点信号——里昂视频

【视频笔记】408新增知识点信号——里昂视频

时间:2024-10-10 18:52:15浏览次数:9  
标签:视频 handle 知识点 int SIGINT 信号 进程 include 408

文章目录


原视频来自于B站里昂,总长22min
视频链接

在这里插入图片描述

进程通信方法:管道,共享内存,消息队列,信号和信号量

在这里插入图片描述


2.信号

一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件。比如,如果当进程在前台运行时,你键入Ctrl+C(也就是同时按下Ctrl键和 C键),那么内核就会发送一个SIGINT信号给这个前台进程

在这里插入图片描述
在linux系统中使用 kill -l 命令查看系统上支持的不同类型的信号。

每种信号类型都对应于某种系统事件,用不同的整数表示,例如SIGINT信号用号码2表示
在这里插入图片描述

比如,如果一个进程试图除以0,那么内核就发送给它一个SIGFPE信号(号码8 Floating Point Exception浮点异常)。
如果一个进程执行一条非法指令,那么内核就发送给它一个SIGILL信号(号码4)。
sigill(ill生病,有病的,不健康的;不良的;不良的;〈美俚〉(因嫌疑而)被捕的,被拘留的;坏的,邪恶的,有害的;不舒服;)

kill -l
#查看系统上支持的不同类型的信号
3.信号的实现

在操作系统中,每个进程都有一个进程控制块(Process Control Block,PCB),它包含了进程的管理和控制信息.。
【例】Linux下,用一个名为task_struct的结构体类型来描述PCB,包括很多字段,如进程的状态进程的标识、进程的优先级等。每一种信息都用一个字段来实现。

struct task struct
{
...
volatile long state; /进程状态
pid_t pid; //进程ID,每个进程都有一个唯一的PID,用于区分不同进程,相当于身份证号
unsigned long rt_priority;//进程优先级
stuct mm_struct*mm,*active_mm;//与内存管理有关的数据结构,包含进程内存使用的信息
...
}

因此,我们可以将信号记录在进程的task_struct(PCB)结构体中。
例如,我们可以用位图来表示某个信号是否产生,每个比特位代表了某个特定的信号,比特位为0代表没有收到了信号,为1则代表收到了信号。进程收到信号,本质是位图被修改

在这里插入图片描述

4.信号的处理

通常有以下三种操作处理信号:

①忽略信号

不采取任何操作。但是有两种信号不能被忽略:SIGKILL(9)和SIGSTOP(19)
这样做的原因是系统管理员需要能够杀死或停止进程,如果进程能够选择忽略SIGKILL(使进程不能被杀死)或SIGSTOP(使进程不能被停止)将破坏这一权力。

②执行信号的默认操作

例如,进程收到SIGINT信号后会终止,本质上是向进程发送了一个编号为2的SIGINT信号,只不过这个信号是通过键盘输入的,然后经过操作系统处理后再发送给进程。
在这里插入图片描述

③捕获井处理信号

内核会暂停该进程正在执行的代码,并跳转到用户注册的函数。

SIGINT原本是用来结束进程的,但用signal自定义它的功能后就可以使它对进程的操作改变,

在这里插入图片描述

#include<singal.h>
#include<stdio.h>
#include<unistd.h>
//handle的函数实现的功能是打印can't stop!"
void handle(int sigNum){
printf("can't stop! sigNum:%d\n",sigNum);
}
int main(){
	signal(SIGINT,handle);
//将SIGINT号信号的功能改成handle
	while(1){
		printf("a\n");
		sleep(1);
	}
return 0;

}

可以看到,每次按下Ctrl+C,都会打印对应内容(实现自定义的功能而不是像原来一样终止进程),而sigNum也证明Ctrl+C对应的信号值确实是2号(SIGINT)。
在这里插入图片描述

经常捕获的两种信号是 SIGINT 和 SIGTERM。

SIGKILL和SIGSTOP 不能被捕获,即无法通过自定义handle函数来修改其信号操作。

exp1

#include<singal.h>
#include<stdio.h>
#include<unistd.h>
//handle的函数实现的功能是打印can't stop!"
void handle(int sigNum){
printf("can't stop! sigNum:%d\n",sigNum);
}
int main(){
	signal(SIGKILL,handle);
//将SIGINT号信号的功能改成handle
	while(1){
		printf("still alive\n");
		sleep(1);
	}
return 0;

}

在这里插入图片描述


exp2

#include<singal.h>
#include<stdio.h>
#include<unistd.h>
int count=0;
//handle的函数实现的功能是打印"count=%d, still alive"
void handle(int sigNum){
printf("count=%d, still alive sigNum:%d\n",sigNum);
}
int main(){
	signal(SIGKILL,handle);
	signal(SIGTERM,handle);
	signal(SIGINT,handle);
//将SIGINT号信号的功能改成handle
	while(1){
		count++;
		sleep(1);
	}
return 0;

}

在这里插入图片描述
2:sigint
15:sigterm
9:sigkill


几个Linux支持的典型信号:

在这里插入图片描述

SIGCHLD
当进程终止或停止时,内核会给进程的父进程发送此信号。在默认的情况下SIGCHLD是被忽略的,如果进程对它们的子进程是否存在感兴趣,那么进程必须显式地捕获并处理该信号。
SIGFPE
不考虑它的名字,该信号代表所有的算术异常,而不仅仅指浮点数运算相关的异常,异常包括溢出、下溢和除以0.
默认的操作是终止进程并形成内存转储文件,但进程可以捕获并处理该信号。
SIGILL
当进程试图执行一条非法机器指令时,内核会发送该信号。默认操作是终止进程并进行内存转储进程可以选择捕获并处理SIGILL。
SIGINT
当用户输入中断符(通常是Ctrl-C)时,该信号被发送给所有前台进程组中的进程默认的操作是终止进程。进程可以选择捕获并处理该信号,通常是为了在终止前进行清理工作

5.信号的产生

信号通常由以下方式产生:

通过终端按键(键盘)产生信号例如,Ctrl+C发送2号信号SIGINT、Ctrl+\发送3号信号SIGQUIT
程序异常时操作系统会向程序发送信号来终止进程。
调用函数
- kill系统调用:

kil()调用会从一个进程向另一个进程发送信号:
int kill(pid t pid,int signo);//调用kill给pid代表的进程发送信号signo。
kill命令本质上是通过系统调用实现的。

- raise系统调用

【例子】创建一个raise程序,将其2号信号的处理函数改为自定义函数,该信号每隔一段时间便会给自己发送信号

#include<singal.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>

void handle(int signo){
printf("get a signal : %d\n", signo);
}
int main(){
	signal(2,handle);
//将2号信号自定义。
	while(1){
		printf("I'm a process, pid = %d\n",getpid());
		sleep(1);
		raise(2);
		//进程自己给自己发送2号信号。
	}
return 0;

}
abort 系统调用

abort 使当前进程接受到信号而异常终止

#include<singal.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>

void handle(int signo){
printf("get a signal : %d\n", signo);
}
int main(){
	signal(6,handle);
//将SIGINT号信号的功能改成handle
	while(1){
		printf("I am a process, pid : %d\n",getpid());
		sleep(1);
		abort();
	}
return 0;

}

在这里插入图片描述

④由于软件条件产生信号

例如alarm()函数可以设置定时器,当定时器倒计时结束,就会向进程发送一个SIGALARM信号。

#include<singal.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>

void handle_alarm(int signo){
printf("Alarm clock!\n");
}
int main(){
//设置信号处理函数
	signal(SIGALRM,handle_alarm);
//做其他事情或者简单地等待
	while(1){
		printf("running\n");
		alarm(2);
		sleep(2);
	}
return 0;

}
⑤ 硬件异常产生信号

发生硬件异常时,它被硬件以某种方式检测到并通知内核,然后内核向当前进程发送适当的信号。
例如当前进程执行了除零的指令CPU的运算单元会产生异常,内核将这个异常解释为SIGFPE信号,并将该信号发送给进程。

总之,使用信号的两个主要目的:
① 让进程知道已经发生了一个特定的事件。
② 强迫进程执行它自己代码中的信号处理程序,
注意,并不是系统中所有进程都可以向其他进程发送信号,只有核心和超级用户可以。

普通进程只可以向拥有相同uid(用户标识号)和gid(组标识号)或者在相同进程组中的进程发送信号。

当信号产生时,内核将进程taskstruct中的信号相应标志位设置为1,表明产生了该信号。

系统对置位之前该标志位已经为1的情况不进行处理,这说明进程只处理最近接收的信号。
信号产生后并不马上送给进程,它必须等待直到进程再一次运行时才交给它。
每当进程从系统调用中退出时,内核会检查它的signal和blocked字段(位图),查看是否有需要发送的非屏蔽信号,若有则立即发送信号。

如果信号的处理被设置为缺省,则系统内核将会处理该信号,否则会执行用户提供的信号处理程序。

【练习1】信号是用户按下Ctrl+C时默认发送给前台进程组的信号?
A. ‘SIGKILL’
B.'SIGSTOP’
C.‘SIGINT’
D.‘SIGTERM’
答案:C

【练习2】哪个信号用于终止进程,并且不能被进程捕获或忽路?
A. 'SIGKILL`
B.“SIGBUS”
C. 'SIGINT
D.'SIGTERM
答案:A

【练习3】在信号的进程通信机制中,以下哪个说法是正确的?
A.对于任意的信号都可以忽略
B.对于任意的信号都可以捕获
C.系统中所有进程都可以向其他进程发送信号
D.系统对置位之前该标志位已经为1的情况不进行处理,这说明进程只处理最近接收的信号
答案:D

标签:视频,handle,知识点,int,SIGINT,信号,进程,include,408
From: https://blog.csdn.net/m0_52024881/article/details/142823703

相关文章

  • 利用git推送或拉取代码到远程仓库-整理知识点
    1.注:1)使用gitremoteaddorigin+地址来增加远程仓库,链接远程git仓库时,使用HTTPSurl,一般会结合PAT(personnalaccesstoken)进行身份认证,而使用SSH地址,则不用。2)使用gitclone+地址来克隆远程仓库(默认远程服务器origin)到本地并默认初始化本地仓库、建立本地分支main。2.初......
  • Qt知识点笔记
    C++高级概念详解一、智能指针1.概述智能指针是C++中用于自动管理内存的工具,它能够确保在适当的时候自动释放内存,防止内存泄漏。2.类型比较2.1原始指针classMyClass{public:MyClass(){std::cout<<"Constructorcalled\n";}~MyClass(){std::cout<<"D......
  • 使用ffmpeg修复本地视频文件(mp4)播放时进度条无法拖动的问题
    右击视频文件查看属性,在详细信息页查看视频时长,显示为空,推测进度条无法拖动的原因是时间轴损坏于是采用了以下解决办法将视频分离出来,命名为video.mp4ffmpeg-i视频名称.mp4-map0:v-vcodeccopy-bsf:vh264_mp4toannexbvideo.mp4将音频分离出来,命名为audio.wavffm......
  • SSM舞者网站hwb4m 上传预览视频
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:用户,舞蹈分类,舞蹈信息,网站介绍开题报告内容一、课题背景及意义随着互联网技术的快速发展,信息传播方式发生了翻天覆地的变化。舞者网站作为信息传播......
  • 12G-SDI高清视频开发案例,让4K视频采集更便捷!基于Xilinx MPSoC高性能平台
    本文主要介绍基于XilinxUltraScale+MPSoCXCZU7EV的12G-SDI高清视频开发案例,适用开发环境如下:Windows开发环境:Windows764bit、Windows1064bitLinux开发环境:Ubuntu18.04.464bit开发工具包:XilinxUnified2022.2硬件平台:创龙科技TLZU-EVM评估板(基于XilinxUltraScale+......
  • PC软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
    前言国庆假期各种活动比较多,直到上班才有时间来更新文章~不过这两天我还是做了个小玩意(Clipify),起因是想给之前开发来自己用的简单视频剪辑工具QuickCutSharp加个功能,不过这个软件是基于WinForms开发的,做界面得拖拉控件,感觉繁琐又不灵活,于是索性重新做一个。原有代码是C#,于......
  • 【FMC214】基于VITA57.1标准的4路12G SDI视频传输FMC子卡模块
     板卡概述FMC214是基于VITA57.1标准的4路12GSDI视频传输FMC子卡模块,该板卡可以作为一个理想的IO单元耦合至FPGA前端,4路BNC接口形式的SDI信号通过电平转换(线缆均衡器)连接至FMC(HPC)接口的高速串行总线上,与FPGA内部的万兆位级收发器(MGT)互联,FPGA内部的SDI固件IP来完成SDI的编解码。......
  • 视频汇聚平台EasyCVR支持云端录像丨监控存储丨录像回看丨录像计划丨录像配置
    EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。平台以其强大的视频处理、汇聚与融合能力,在构建视频监控系统中展现出了独特的优势。EasyCVR视频汇聚平台可接入传统监控行业中高清网络摄像机的RTSP直播流,及RTMP、HTTP-FLV、HLS(......
  • 矿井人员视频行为分析
    矿井人员视频行为分析系统通过在矿井内部布设监控摄像头,矿井人员视频行为分析实时监测人员的作业行为,矿井人员视频行为分析利用视频分析技术,对人员的行为进行自动分析和识别,并与安全标准进行比对。矿井人员视频行为分析通过视频分析和行为识别,可以及时发现不符合安全要求的行为,预......
  • Scala基础知识点
    1.Scala编译后文件的后缀名为.class。2.Scala有两种类型的变量,一种是使用关键字var声明的变量,值是可变的;另一种是使用关键字val声明的变量,也叫常量,值是不可变的。3.Null是所有引用类型的子类型,主要用途是与其他JVM语言互操作,几乎不在Scala代码中使用。4.Scala中可以使用def......