• 信号的概念
  • 信号的生命周期
  • 信号的阻塞

信号的概念

信号

信号是一个软中断。操作系统通过信号通知某个进程发生了某件事件,然后中断这个进程当前操作,让它优先去处理这个事件。

我们在linux下常用的kill命令就是通过向进程发送一个信号来使进程中断,我们可以通过kill -l来查看信号的种类

信号的种类


可以看到32和33号信号是不存在的,并且1-31是有具体名称的,而34号及之后的都是以SIGTMIN+数字命名。

信号种类:62种

不可靠信号:1-31号,从unix借鉴而来,每个都有对于的系统事件,不可靠是因为可能会丢失信号导致事件丢失

可靠信号:34-64号,后期扩充的,因为没有具体对应的事件,所以命名比较草率,不会丢失信号。


信号的生命周期

生命周期:产生信号->在进程中注册信号->在进程中注销进行->处理信号

信号的产生:

  1. 通过终端按键产生信号
    例如常用的ctrl + z、ctrl + c、ctrl + \就是分别产生了SIGTSTP、SIGINT、SIGQUIT信号。
  2. 通过调用系统函数向进程发送信号
    例如kill -x函数,x就是对应的信号的序号,如果不知名则发送15号信号SIGTERM。kill杀死进程的原理就是通过发送一个信号,让这个进程中断并去处理这个信号,然而这个信号的处理结果就是让这个进程退出。
    3.通过软件异常产生信号
    例如上一篇说过管道如果读端全部关闭,而写端没关闭时就会发送一个SIGPIPE的信号
    4.通过硬件异常产生信号
    例如当运算中以0为除数,则CPU的运算单元会检测到除0异常,并发送SIGFPE信号

信号的注册

信号注册的流程主要是修改pcb中的pending位图并向pcb中的sigqueue链表中添加新的节点,但根据信号的种类不同操作也不同。

不可靠信号的注册:
首先查看pending位图该信号的标志位是否为0,如果为0则将标志位修改为1,并向sigqueue链表添加新的节点。如果为1则说明该信号已经注册过,则忽略此次事件,什么都不做,也正是因为这样会导致事件的丢失,才被称为不可靠信号。

可靠信号的注册:
可靠信号注册时则不管该信号是否注册过,都会往sigqueue链表中添加新的节点并修改位图,这样就保证了每一个发送的事件都会被处理,这也是被称为可靠的原因。

信号的注销

为了保证每一种信号只被处理一次,所以需要先注销再处理。
注销就是消除这个信号存在的痕迹,即修改位图,删除sigqueue中的节点。

不可靠信号的注销:
因为不可靠信号只注册了一次,只需要删除sigqueue中的节点,然后所以将位图对应的标志位置零。

可靠信号的注销:
因为可靠信号注册了多次,添加了多个节点,所以需要删除该信号添加的所有相同节点,才将位图对应的标志位置零。

信号的处理

因为信号是操作系统发给进程来通知某个事件的到来,所以对信号的处理也就是对事件的处理。

信号的处理方式:
  1. 默认处理方式: 就是操作系统为每一种信号准备的对应的处理方式

  2. 忽略处理方式: 和名字一样,忽略,什么都不做

  3. 自定义处理方式: 我们可以自己写一个回调函数来替换原来的处理方法,完成我们想要对这个信号的处理方式。


信号的捕捉流程

  1. 在主函数时因为异常或者中断或者系统调用进入内核态。
  2. 处理完异常后开始处理信号
  3. 调用用户自定义的回调函数,返回用户态
  4. 回调函数执行完毕,通过系统调用sigreturn返回内核态
  5. 信号处理完毕,调用sys_sigreturn()返回到一开始主函数被中断的地方,继续执行下面的语句。

接口:

   sighandler_t signal(int signum, sighandler_t handler);信号typedef void (*sighandler_t)(int);//回调函数,这是一个函数指针,我们通过编写自己的回调函数,然后signal通过函数指针来找到这个函数,替换到原来的操作

signum:信号的序号
handler:处理方式
头文件:#include <signal.h>
返回值:返回一个函数指针,也就是第二个参数


信号的阻塞

信号的阻塞并不是不注册一个信号,而是注册后暂时先不对它进行处理,在block位图中修改标志位,将其阻塞,直到进程解除对该信号的阻塞的时候再处理这个信号

同时,有两个信号比较特殊,9号信号SIGKILL和19号信号SIGSTOP这两个信号不可被阻塞,不可被忽略,不可被自定义处理

接口:

Linux 进程信号:信号的概念、生命周期、产生流程、阻塞相关推荐

  1. Linux进程(二):生命周期

        在Linux系统中,每个进程都有自己的生命周期.   Linux进程状态 ​   在Linux中,大多数进程都是被fork()出来的,进程被fork创建后,则会进入就绪态,进入就绪态的进程等待 ...

  2. linux exec 二程序,二十五、Linux 进程与信号---exec函数

    25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...

  3. linux进程被信号杀死,Linux 命令 - kill: 向进程发送信号

    kill 命令通常用来 "杀死"(终止)进程,它可以用来终止运行不正常的程序或者反过来拒绝终止的程序.kill 命令准确地说并不是 "杀死" 进程,而是给进程发 ...

  4. linux进程被信号杀死,linux杀死进程以及发送或响应信号

    摘要 腾兴网为您分享:linux杀死进程以及发送或响应信号,真还赚,邮币在线,优美图,小t智联等软件知识,以及idevice,cdr条码生成器,二手车闪卖,卡卡日语,微帮手,arpr,萤石云监控,nf ...

  5. Vue 生命周期篇探索 - 第二篇:生命周期-挂载流程

    文章目录 探索学习 Vue 生命周期篇 第二篇:生命周期-挂载流程 以图例分析挂载流程 1. new Vue 2. init Events & Lifecycle 3. beforeCreat ...

  6. Vue 生命周期篇探索-第三篇:生命周期-更新流程

    文章目录 探索学习 Vue 生命周期篇 第三篇:生命周期-更新流程 生命周期-更新流程 1. mounted(挂载后) 2. beforeUpdate (更新前) 3. Virtual DOM re- ...

  7. Vue 生命周期探索:第四篇:生命周期-销毁流程

    文章目录 探索学习 Vue 生命周期篇 第四篇:生命周期-销毁流程 生命周期_销毁流程 1. beforeDestory (销毁前) 2. Teardown watchers,child compon ...

  8. 转载 骏马金龙第9章 Linux进程和信号超详细分析

    本文原创地址:骏马金龙https://www.cnblogs.com/f-ck-need-u/p/7058920.html 9.1 进程简单说明 进程是一个非常复杂的概念,涉及的内容也非常非常多.在这 ...

  9. Linux 进程通信 -- 信号

    一.概述 信号用于保持进程间的通信,可以备发送到一个进程或者一组进程,发送给进程的这个唯一信息通常是标志信号的一个数.信号可从键盘终端产生.虚拟内存中非法访问系统资源等情况下产生.信号异步发生,收到信 ...

  10. linux(一)export的生命周期

    本文从shell执行的角度分析export变量的生命周期 # 只对当前shell环境起作用,比如通过不同的远程ssh就是不同的shell环境 export k=v 当运行一个.sh文件或者是shell ...

最新文章

  1. 课后作业-阅读任务-阅读提问-1
  2. golang中的mysql类型对应
  3. 【Python学习系列二十八】绘图库pyecharts
  4. gnuradio android手机,如何搭配USRP在安卓设备上搭建GNU Radio
  5. 为你的项目启用可空引用类型
  6. 美团 iOS 工程 zsource 命令背后的那些事儿
  7. scada系统集成_MES/MOM与WMS系统集成应用案例-系统接口、交互数据分析
  8. java poi操作word2007_java使用poi解析2007以上的word文档中的表格与图片
  9. 修改SR4000自带软件,支持opencv
  10. jquery 获取指定元素
  11. 微博 php7,PHP_迁移PHP版本到PHP7,今天看到微博上说phpng也就是ph - phpStudy
  12. DPDK-l3fwd示例IPv6测试
  13. NPM problem: npm ERR! extraneous
  14. 2020.12.04 常用Linux命令
  15. loadrunner的安装
  16. 企业级监控平台,监控系统选型
  17. 微信小程序操作mysql_微信小程序:数据库操作
  18. Spring boot系统拦截处理异常调转404/500页面
  19. 【Yocto学习入门】02 - 构建一个简单的Poky参考嵌入式操作系统
  20. 本科毕业论文研究结果与预期不符怎么办?

热门文章

  1. Spring Boot整合Spring Data Redis-存取JSON格式Java对象
  2. SpringBoot_数据访问-JDBC自动配置原理
  3. word2vec相似度计算_文档相似度助力搜索引擎
  4. mysql 5.7 速度很快_MySQL5.7速度比MySQL5.6快3倍
  5. 前端js实现字符串/图片/excel文件下载
  6. matplotlib.pyplot---------Python强大的绘图功能软件
  7. JavaScript进行UTF-8编码与解码
  8. IBM致梁允超:乘着新技术东风 SaaS100+让汤臣“倍”加健壮
  9. 网络服务器开发总结(转:http://my.oschina.net/u/181613/blog/596022)
  10. C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组