Linux的信号管理 [补档-2023-07-30]
信号
11-1简介:
信号只是表示某个信号,不可以携带大量信息,信号需要满足特点的条件才会产生。是一种特别的通信手 段。
11-2 信号机制:
假设有两个进程A,B,现在进程A给进程B发送信号,进程B在收到信号之前会执行自己的代码,当收到 信号后,无论执行到了哪里,都要暂停执行然后去处理信号。当处理完信号后再接着执行。类似于硬件中的中 断。但信号是在软件层面上实现的中断,常备称为软中断。
每个进程所收到的信号都是由内核负责发送的,也就是说进程A会将信号发给内核,然后内核再将信号转 发给进程B。由此可以得出信号的实现具有一定的延时性。
在pcb进程控制块中,结构体task struct中也包含了信号的相关信息。
11-3 信号的状态:
分为三种状态:产生,未决和递达。
产生:
按键产生:ctrl+c ,ctrl+z ,ctrl+\
系统调用产生:kill,raise,about
软件条件产生:定时器alarm
硬件异常产生:段错误,内存对齐出错,除0.
未决:介于产生和递达之间,未决状态下的信号在等待处理,至于为什么等待可能是被阻塞了。
递达:信号已经被送到目标进程,并且等待处理。
11-4 阻塞信号集和未决信号集
阻塞信号集:里面保存的是当前进程被阻塞的信号,当进程收到了阻塞信号集中的信号,则可以先放一放 这些信号,不予处理,先去干别的。
未决信号集:当信号产生后由于某些原因可能没有被处理,则这些信号会被存储在这里。
关系:当一个信号被产生时,他首先会进入未决信号集,然后根据进程当前的信号阻塞状态来决定是否进 入递达状态。如果阻塞信号集在有相应的信号被阻塞,则该信号会一直保持在未决状态,直到接触阻塞。有相 应的函数可以选择性地阻塞和屏蔽信号。
11-5 信号的四要素:
1.信号的编号:可以通过kill -l命令来查看当前系统有哪些信号。1到31号的信号为常规信号,34到36 为实时信号。
2.信号的名称:例如SIGINT表示中断信号。
3.产生信号的事件:例如用户按下crlt+z会终止程序。
4.信号的默认处理动作:例如crlt+z产生的信号它的处理动作是终止程序的执行。
以下是常见的信号,前面的数字是信号的编号,后面的大写字母是信号名称。
1 SIGHUP(挂起):终端连接断开。
2 SIGINT(中断):用户按下Ctrl+C键。
3 SIGQUIT(退出):用户按下Ctrl+\键。
4 SIGILL(非法指令):进程执行了非法的CPU指令。
6 SIGABRT(中止):进程发生异常终止。
8 SIGFPE(浮点异常):发生浮点运算错误。
9 SIGKILL(强制终止):无条件终止进程。
11 SIGSEGV(段错误):进程访问了未分配给它的内存段。
13 SIGPIPE(管道破裂):写入已关闭的管道或读取没有打开的管道。
14 SIGALRM(闹钟超时):计时器到达指定时间。
15 SIGTERM(终止):请求进程正常终止。
30 SIGUSR1(用户自定义信号1):用户定义的信号1。
31 SIGUSR2(用户自定义信号2):用户定义的信号2。
11-6 信号相关函数:
11-6-1 signal函数:
头文件:#include <signal.h>
函数原型:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum , sighander_t handler);
解析:使用typedef重新定义了一个函数指针类型sighandler_t,并且指向接受一个int类型参数并返 回void的函数的指针类型。
函数作用:注册信号捕捉函数。
函数参数:
signum:信号编号。(填写信号的名称)
handler:信号处理函数。
函数返回值:成功则返回一个指向之前信号处理函数的指针。失败则返回SIG_ERR。
11-6-2 kill函数/命令:
函数/命令的功能:给指定的进程发生指定的信号。
kill命令:
kill [options] <pid>
options:
-l 列出所有可用的信号名称。
-s <信号名称> 指定要发送的信号。
-<信号名称> 同上。
-p 不发送信号,仅打印与指定进程匹配的进程ID。
-a 打印进程的详细信息。
pid:进程的pid。
kill函数:
头文件:#include <signal.h>
函数原型:int kill(pid_t pid , int sig);
函数参数:
pid:
pid大于0:发送信号给指定的进程。
pid等于0:发送信号给与调用kill函数属于同一进程组的所有进程。
pid小于-1:取pid的绝对值,然后给对应的进程发信号。
pid等于-1:向当前会话中的所有进程发送信号。
sig信号参数:填入要使用的信号名称。
函数返回值:成功返回0,失败返回-1.
进程组:一组有关联的进程的集合。
11-7 raise函数和abort函数:
11-7-1 raise函数:
头文件:#include <signal.h>
函数原型:int raise(int sig);
函数功能:给自己发信号。
函数参数:信号的名称。
函数返回值:成功返回0,失败返回非0值。
11-7-2 abort函数:
头文件:#include <signal.h>
函数原型:void abort(void);
函数功能:给自己发送异常终止信号 6 SIGABRT,并且产生core文件。
函数无返回值和函数参数。
11-8 alarm函数:
头文件:#include <unistd.h>
函数原型:unsigned int alarm(unsigned int seconds);
函数功能:设置定时器,在指定的seconds后,内核会给当前进程发送 14 SIGALRM信号,当进程收到该 信号,则默认动作终止。每一个进程只能有一个定时器。
函数参数:填等待秒数。
函数返回值:返回0或者剩余的秒数,不存在调用失败的情况。
其他操作:可以给alarm的值设置为0来关闭已经设置好的定时器。
11-9 setitimer函数:
头文件:#include <sys/time.h>
函数原型:int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
函数功能:设置定时器,可以代替alarm函数,精度为微妙,可以实现周期定时。
函数参数:
which:指定定时方式。
自然定时:ITIMER_REAL 使用真实时间最为计时器的基准。
虚拟空间计时(用户空间):ITIMER_VIRTUAL 使用进程在用户态运行的虚拟时间作为计时器的基准。
运行时计时(用户+内核):ITIMER_PROF使用进程在用户态和内核态运行的虚拟时间作为计时器的基准.
new_value:struct itimerval,负责设定timeout时间。
itimerval.it_value:设定第一次执行function所延迟的秒数。(时钟触发时间)
itimerval.it_interval:设定以后每几秒执行function。(时钟触发周期)
old_value:存放旧的timeout值,一般指定为NULL
函数返回值:成功返回0,失败返回-1.
11-10 信号集相关函数 (需包含头文件头文件:#include <signal.h>)
11-10-1 sigemptyset函数:
函数原型:int sigemptyset(sigset_t *set);
函数功能:将某个信号集清0.
函数参数:set参数是一个指向sigset_t类型的指针,表示要操作的信号集。
函数返回值:成功返回0,失败返回-1.
11-10-2 sigfillset函数:
函数原型:int sigfillset(sigset_t *ser);
函数功能:将某个信号集置1.
函数参数:set参数是一个指向sigset_t类型的指针,表示要操作的信号集。
函数返回值:成功返回0,失败返回-1.
11-10-3 sigaddset函数:
函数原型:int sigaddset(sigset_t *set, int signum);
函数功能:将某个信号加入到信号集中。
函数参数:
set:它是一个指向sigset_t类型的指针,表示要操作的信号集。
signum:它是信号的名称。
函数返回值:成功返回0,失败返回-1.
11-10-4 sigdelset函数:
函数原型:int sigdelset(sigset_t *set, int signum);
函数功能:将某个信号从信号集中清除掉。
函数参数:
set:它是一个指向sigset_t类型的指针,表示要操作的信号集。
signum:它是信号的名称。
函数返回值:成功返回0,失败返回-1.
11-10-5 sigismember函数:
函数原型:int sigismember (const sigset_t *set, int signum);
函数功能:判断某个信号是否在信号集中。
函数参数:
set:它是一个指向sigset_t类型的指针,表示要操作的信号集。
signum:它是信号的名称。
函数返回值:
如果存在则返回1。
如果不存在则返回0。
如果调用出错则返回-1。
11-10-6 sigprocmask函数:
函数原型:int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
函数功能:用来检查和修改进程的信号屏蔽字。
函数参数:
how:指定了对信号屏蔽字的操作方式。
SIG_BLOCK:将set指向的信号集中的信号添加到当前信号屏蔽字中。如果信号已经被阻塞则任然保持阻塞状态。
SIG_UNBLOCK:从当前信号屏蔽字中解除set指向的信号集中的信号的阻塞。
SIG_SETMASK:使用set指向的信号集替换当前的信号屏蔽字。
set:是一个指向sigset_t类型的指针,表示要设置的新的信号屏蔽字。sigset_t是一个位向量表示多个 信号。
oldset:是一个指向sigset_t的指针,用于存储旧的信号屏蔽字,如果不需要保存旧的则可以填NULL。
函数返回值:成功返回0,失败fanhui-1。
11-10-7 sigpending函数:
头文件:#include <signal.h>
函数原型:int sigpending(sigset_t *set);
函数功能:读取当前进程的未决信号集。
函数参数:set参数是一个指向sigser_t类型的指针,用于存储当前进程的未决信号集。。
函数返回值:成功返回0,失败返回-1。
11-11 信号捕捉函数sigaction
头文件:#include <signal.h>
函数原型:int sigaction(int signum, const struct sigaction *acr, struct sigaction *oldact);
函数功能:注册一个信号处理函数。
函数参数:
signum:要捕捉的信号。
act:新的处理方式
oldact:旧的处理方式。
函数参数中的结构体定义:
struct sigaction {
void (*sa_handler)(int); // 信号处理函数
void (*sa_sigaction)(int, siginfo_t *, void *); //信号处理函数
sigset_t sa_mask; //信号处理函数执行期间需要阻塞的信号
int sa_flags; //通常为0,表示使用默认标识
void (*sa_restorer)(void);
};
结构体成员变量的具体意义:
sa_handler:指定信号捕捉后的处理函数名。当信号出现时,则使用这个函数进行处理。
sa_mask:用来指定在信号处理函数执行的期间,要被屏蔽的信号。
sa_flags:额外选项。可以默认设置为0。
SA_RESTART:使被信号中断的系统调用自动重启。
SA_NOCLDSTOP:终止子进程时,不产生 SIGCHLD 信号。
SA_SIGINFO:指定 sa_sigaction 字段作为信号处理函数,并允许传递附加信息。
sa_restorer:一般设置为NULL,在最新的linux内核中,他已经被忽略。
函数返回值:成功返回0,失败返回-1。
Linux的信号管理 [补档-2023-07-30]的更多相关文章
- Linux的信号管理
man 7 signal #查看信号的实用信息 常用的信号: 信号名 编号 含义SIGHUP 1 无须关闭进程而让其重读配置文件SIGINT 2 ...
- linux系统日常管理
笔者在前面介绍的内容都为linux系统基础类的,如果你现在把前面的内容全部很好的掌握了,那最好了.不过笔者要说的是,即使你完全掌握了,你现在还是不能作为一名合格的linux系统管理员的,毕竟系统管理员 ...
- Linux内核电源管理综述
资料:http://blog.csdn.net/bingqingsuimeng/article/category/1228414http://os.chinaunix.net/a2006/0519/1 ...
- centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课
centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课 ...
- linux 系统管理--进程管理
目录 linux 系统管理--进程管理 一.进程基本概述 二.监控进程状态 三.进程的优先级[进阶] 四.企业案例,Linux假死是怎么回事 五.后台进程管理 六.系统平均负载[进阶] linux 系 ...
- linux 系统磁盘管理体系
目录 linux 系统磁盘管理体系 一.磁盘的基本概念 二.磁盘的内部结构 三.磁盘的外部结构 四.磁盘的接口及类型 五.fdisk磁盘分区实践 六.gdisk 分区 七.parted 高级分区工具. ...
- 鸟哥的linux私房菜——第十三章学习(Linux 帐号管理与 ACLL 权限设置)
第十三章.Linux 帐号管理与 ACLL 权限设置 1.0).使用者识别码: UID 与 GID UID :User ID GID :group ID [root@study ~]# ll -d / ...
- Linux程序包管理之yum及源代码安装
第十六章.Linux程序包管理之yum及源代码安装 目录 yum介绍 yum配置文件 yum的repo配置文件中可用的变量 yum命令的使用 使用光盘作为本地yum仓库 如何创建yum仓库 编译安装的 ...
- PHP 信号管理
.note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...
- [20150513]Linux远程登陆管理以及Vim的学习
Linux远程登陆管理以及Vim的学习 实现Linux远程管理 所需工具Xshell,Xshell是一个用于MS Windows平台的强大的SSH,TELNET,和RLOGIN终端仿真软件.它使得用户 ...
随机推荐
- Exception in thread "main" joptsimple.UnrecognizedOptionException: zookeeper is not a recognized option
背景: 在kafka集群上使用topic相关的命令时,报错: Exception in thread "main" joptsimple.UnrecognizedOptionExc ...
- 如何在CSDN上如何快速转载博客
复制粘贴应该是最显而易见的方法,但是不仅会有丢失内容,而且格式也会丢失.要想达到更好的效果,可以从html源码入手. 1.在chrome浏览器中打开要转载的文章,右键选择检查(or使用F12) 2.在 ...
- 图解 Promise 实现原理(一)—— 基础实现
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/UNzYgpnKzmW6bAapYxnXRQ作者:孔垂亮 很多同学在学习 Promise 时,知 ...
- Spring相关原理
Spring是什么? Spring是一个轻量级的IoC和AOP容器框架.常见的配置方式有三种:基于XML的配置.基于注解的配置.基于Java的配置. 模块分为以下:Spring Core:Spring ...
- mysql8.0环境搭建linux
本文主要介绍如何在linux环境(64位)下搭建mysql8.0的数据库环境 1.到指定目录下下载安装包 [root@minio3 ~]# cd /usr/local/src [root@minio3 ...
- <vue 路由 1、路由的基本使用>
一. 项目创建 参考如下博客地址创建一个vue的项目 https://www.cnblogs.com/yclh/p/15356171.html vue学习笔记 二.环境搭建+项目创建 二. ...
- 运行vue项目时报错“ValidationError: Progress Plugin Invalid Options”
https://blog.csdn.net/M_Nobody/article/details/123135041?spm=1001.2101.3001.6650.1&utm_medium=di ...
- 一套前后台全部开源的H5商城送给大家
博主给大家推荐一套全部开源的H5电商项目waynboot-mall.由博主在2020年开发至今,已有三年之久.那时候网上很多的H5商城项目都是半开源版本,要么没有H5前端代码,要么需要加群咨询,属实恶 ...
- 01-module/分频器/激励写法
1.module module有出入接口,输出接口 module有时钟和复位 // input clock; rest_n; // n表示低电平复位 //output o_data; module m ...
- ORACLE Enterprise Manager Database Express(OEM-express)(遇到localhost拒绝访问情况)配置端口和启动方法
1.问题 之前一直进不去ORACLE Enterprise Manager Database Express,显示的是localhost拒绝了访问,经过查阅知道是没有配置相应端口. 2.解决方法 转载 ...