linux 学习 day 07 进程信号

信号例子

在这里插入图片描述

  1. ctrl+c 产生的信号只能发给前台进程.一个命令后面加个& 可以放到后台运行,这样shell不必等待进程结束,就可以接收新的命令,启动新的进程。
  2. shell 可以同时运行一个前台进程和多个后台进程,只有前台进程才能接收到像 ctrl + c 、ctrl + \ 这样的命令。
  3. 前台进程在运行过程中用户随时可能按下 ctrl + c 而产生一个信号,也就是说该进程的用户空间代码执行到任何地方都有可能收到SIGINT信号而终止,所以信号相对于进程来讲是异步(Asynchronous)的。

信号: 信号是进程之间事件异步通知的一种方式,属于软中断。

使用kill -l 命令查看系统定义的信号列表

在这里插入图片描述

  • 每个信号都有一个编号和一个宏定义可以在signal.h 中找到。
  • 编号34 以上的是实时信号。
  • 在 signal(7) 中有信号的详细说明。

信号处理的常见方式

  1. 忽略此信号。
  2. 执行该信号的默认处理动作。
  3. 提供一个信号处理函数,要求在内核处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(catch)一个信号。

产生信号

通过终端按键产生信号

SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且Core Dump。

core dump

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

调用系统函数像进程发信号

在这里插入图片描述


在这里插入图片描述

软件条件产生信号

在这里插入图片描述

硬件异常产生信号

硬件异常被硬件以某种方式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释 为SIGFPE信号发送给进程。再比如当前进程访问了非法内存地址,MMU会产生异常,内核将这个异常解释为SIGSEGV信号发送给进程。

信号捕捉初识

在这里插入图片描述

思考

  • 所有信号产生,最终要有OS来进行执行,因为OS是进程的管理者。
  • 信号不是立即处理的,而是在合适的时候处理? 什么时候合适。
  • 信号如果不是被立即处理,那么信号是否需要被进程记录下来?记录在何处合适?
  • 一个进程在没有接收到信号额时候,能否知道自己应该对合法信号作何处理呢?
  • 如何理解OS向进程发送信号?描述下处理过程。

阻塞信号

  • 实际执行信号的处理动作称为信号的递达(Delivery)。
  • 信号从产生到递达之间的状态称之为未决(Pending)。
  • 进程可以选择阻塞(Block)某个信号。
  • 被阻塞的信号产生将保持在未决状态,直到进程解除对此信号的阻塞,才能执行递达的动作。
  • 注意,阻塞呵忽略是不同的,只要信号被阻塞就不会被递达,而忽略是在递达之后可选的一种处理动作。
在内核角度

在这里插入图片描述

sigset_t

在这里插入图片描述

信号集操作函数

在这里插入图片描述

  • 函数sigemptyset初始化set所指向的信号集,使其中所有信号的对应bit清零,表示该信号集不包含 任何有效信号。
  • 函数sigfillset初始化set所指向的信号集,使其中所有信号的对应bit置位,表示 该信号集的有效信号包括系统支持的所有信号。
  • 注意,在使用sigset_ t类型的变量之前,一定要调 用sigemptyset或sigfillset做初始化,使信号集处于确定的状态。初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信号。

这四个函数都是成功返回0,出错返回-1。sigismember是一个布尔函数,用于判断一个信号集的有效信号中是否包含某种 信号,若包含则返回1,不包含则返回0,出错返回-1

sigprocmask

调用函数 sigprocmask 可以读取或更改进程的信号屏蔽字(阻塞信号集)。

在这里插入图片描述


在这里插入图片描述

sigpending

在这里插入图片描述


在这里插入图片描述

信号捕捉

在这里插入图片描述

内核如何实现信号的捕捉

如果信号处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。由于信号处理函数的代码在用户空间,处理过程比较复杂,举例如下: 用户注册了SIGQUIT信号的处理函数sighandler. 当前正在指向main函数,这时发生中断或者异常切换到内核态。在中断处理完毕后要返回用户态的main函数之前检查到有信号SIGQUIT递达。内核决定返回用户态后不是恢复main函数的上下文继续执行,而是执行sighandler函数,sighandler和main函数使用不同的堆栈空间,他们之间不存在调用和被调用的关系,而是两个独立的执行流程。sighandler 函数返回后,自动执行特殊的系统调用sigreturn 再次进入内核态。如果没有新的信号要递达,这次再返回用户态就是恢复main函数的上下文继续执行。

sigaction

在这里插入图片描述

  • sigaction 函数合一读取和修改与指定信号相关联的处理动作。调用成功返回0,出错返回-1. signo 是指定信号的编号。 若act指针非空,则根据act修改该信号的处理动作。 若oact指针非空,则通过oact传出该信号原来的处理动作。act 和 oact 指向sigaction结构体。
  • 将sa_handler 赋值为常数SIG_IGN传给sigaction表示忽略信号,赋值为常数SIG_DFL表示执行系统默认动作,赋值为一个函数指针表示用自定义函数捕捉信号,或者说向内核注册了一个信号处理函数,该函数返回值类型为void,可以带一个int参数,通过参数可以得知当前信号的编号,这样就可以用同一个函数处理多种信号。显然这也是一个回调函数,不是被main函数调用而是OS调用。

当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产生,那么 它会被阻塞到当前处理结束为止。 如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。 sa_flags字段包含一些选项,本章的代码都把sa_flags设为0,sa_sigaction是实时信号的处理函数。

可重入函数

在这里插入图片描述

volatile

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

SIGCHLD 信号

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340