学习一下信号的处理机制。

一、信号的产生

信号是有可能来自内核,也有可能来自进程。当然,最根本的来源是信号产生函数。

其实就是通过内核更新目标进程的数据结构以表示一个信号已经被发送。

其中为进程产生信号的函数有:

函数名

说明

send_sig()

向单一进程发送信号

send_sig_info()

与send_sig()类似,只是还使用siginfo_t结构中的扩展信息

force_sig()

发送既不能被进程显示忽略,也不能被进程阻塞的信号

force_sig_info()

与force_sig()类似,只是还使用siginfo_t结构中的扩展信息

force_sig_specific()

与force_sig()类似,但是优化了对SIGSTOP和SIGKILL信号的处理

sys_tkill()

tkill()的系统调用处理函数

sys_tgkill()

tgkill()的系统调用处理函数

为线程组产生信号的函数有:

函数名

说明

send_group_sig_info()

向某一个线程组发送信号,该线程组由它的一个成员进程的描述符来识别

kill_pg()

想一个进程组中的所有线程组发送信号

kill_pg_info()

与kill_pg()类似,只是还使用siginfo_t结构中的扩展信息

kill_pg_proc()

向某一个线程组发送信号,该线程组由它的一个成员进程的pid来识别

kill_pg_proc_info()

与kill_pg_proc ()类似,只是还使用siginfo_t结构中的扩展信息

sys_kill()

kill()的系统调用处理函数

sys_rt_sigqueueinfo()

rt_sigqueueinfo()的系统调用处理函数

二、信号的传递

当内核注意到一个信号到来,并调用相关函数为接受此信号的进程准备描述符。但是万一这个进程那一刻并不在CPU上运行,内核就只能延迟传递信号的任务。因此这里就有两个queue,分别储存私有信号和共享信号。每当内核处理完一个中断或异常时,就检查是否存在挂起信号(即检查TIF_SIGPENDING)。如果存在挂起信号,那么内核就会调用do_signal函数。这个函数会循环执行,直到将两个队列中的所有非阻塞信号都处理完才退出。

既然直到do_signal()整个过程干了什么,那么接下来就描述一下对于每一个信号,do_signal会进行怎么样的处理。首先,它会检查current接收进程是否受到其他一些进程的监控;在肯定的情况下,do_signal函数调用相关函数让监控进程知道current接收进程的信号处理;然后do_signal()要把处理信号的k_sigaction数据结构的地址赋值给局部变量ka,再根据ka内容来执行三种操作:忽略信号、执行缺省操作或执行信号处理程序。

三、信号的处理

在第二点中已经提到了进程收到信号之后的可能三种操作。这里只描述执行信号处理程序的过程。这个过程比较复杂。

如果信号有一个专门的处理程序,那么do_signal()函数就会通过调用handle_signal()来强迫该处理程序执行。但是信号处理程序都是用户态进程所定义的,并包含在用户态的代码段中。handle_signal()函数运行在内核态,而信号处理程序运行在用户态,这就意味着在当前进程恢复“正常”执行之前,它首先必须执行用户态的信号处理程序。而且当内核打算恢复进程的正常执行时,内核态堆栈不再包含被中断程序的硬件上下文,因为每当从内核态向用户态转换时内核态堆栈都会被清空。而如果信号处理程序调用了系统调用,那么这个执行过程的复杂程度就更高了。

Linux对此过程的解决方案是把保存在内核态堆栈中的硬件上下文拷贝到当前进程的用户态堆栈中。用户态堆栈也以这样的方式被修改,当信号处理程序终止时,自动调用sigreturn()系统调用把这个硬件上下文拷贝回内核态堆栈中,并回复用户态堆栈中原来的内容。

该过程流程图如下:

更多的细节不在此描述了。

信号处理的流程linux,linux信号处理机制相关推荐

  1. linux驱动模型开发——linux platform总线机制讲解与实例开发

    1.概述: 通常在Linux中,把SoC系统中集成的独立外设单元(如:I2C.IIS.RTC.看门狗等)都被当作平台设备来处理. 从Linux2.6起,引入了一套新的驱动管理和注册机制:Platfor ...

  2. linux的idr机制

    最近研究进程间通信,遇到了idr相关的函数,为了扫清障碍,先研究了linux的idr机制.         所谓IDR,其实就是和身份证的含义差不多,我们知道,每个人有一个身份证,身份证只是 一串数字 ...

  3. Linux协议栈--NAPI机制

    Linux内核中的NAPI机制介绍 本文将介绍Linux内核中的NAPI:Linux网络设备驱动程序中的一种支持新一代网络适配器的架构. New API(NAPI)用于支持高速网卡处理网络数据包的一种 ...

  4. Linux 安全缓解机制总结

    Linux 安全缓解机制总结_panhewu9919的博客-CSDN博客 学习资料: kernel-security-learning linux-kernel-defence-map A Decad ...

  5. [linux]platform总线机制与wtd驱动开发

    Linux之platform总线机制与wtd驱动开发 1.概述: 通常在Linux中,把SoC系统中集成的独立外设单元(如:I2C.IIS.RTC.看门狗等)都被当作平台设备来处理. 从Linux2. ...

  6. openVswitch(OVS)源代码之linux RCU锁机制分析

    前言 本来想继续顺着数据包的处理流程分析upcall调用的,但是发现在分析upcall调用时必须先了解linux中内核和用户空间通信接口Netlink机制,所以就一直耽搁了对upcall的分析.如果对 ...

  7. Linux Netfilter实现机制和扩展技术

    Linux Netfilter实现机制和扩展技术 杨沙洲 ( pubb@163.net)国防科技大学计算机学院 简介: 本文从Linux网络协议栈中报文的流动过程分析开始,对Linux 2.4.x内核 ...

  8. linux生成initrd,linux的initrd机制和initramfs机制之initrd

    以2.6以后的内核讨论 一.概念 什么是initrd? initrd的解释是initialized RAM disk,就是启动的时候由uboot来初始化内存,当做disk来使用.在uboot启动的时候 ...

  9. linux进程管理机制,linux进程管理,linux进程管理机制

    linux进程管理,linux进程管理机制 一.基本介绍 1.在 LINUX 中,每个执行的程序(代码)都称为一个进程.每一个进程都分配一个 ID 号 2.每一个进程,都会对应一个父进程,而这个父进程 ...

  10. Linux内核同步机制之(四):spin lock【转】

    转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...

最新文章

  1. docker新增目录映射_开发也需了解的运维知识之Docker
  2. 选购光端机有哪些必备条件
  3. 【转】详细解析Java中抽象类和接口的区别
  4. 北京大学c语言试题及答案,北大网络教育(计算机专业)C程序设计作业答案
  5. CentOS 安装gnutls
  6. 不属于python数据类型的是_python基础3 ---python数据类型二
  7. 具有自适应空间强度约束和隶属度链接的鲁棒模糊c均值聚类算法
  8. Selenium碰到的异常记录
  9. Netty优雅退出机制和原理
  10. 一级计算机考试比分,人工智能期末考试模拟试题一01
  11. python操作word.7.19笔记
  12. J-Flash下载STM32用J-link的设置方法
  13. 实用的视频去水印方法
  14. 计算机桌面无法中英文切换,输入法无法切换到中文怎么办_输入法失效只能打英文的解决方法...
  15. win7、win10常用快捷键
  16. 苹果推送通知办事教程 Apple Pushnb
  17. 接口自动化测试之接口测试基础
  18. 2012 5.4青年节--上海出差
  19. 被误解最大的基础学科——统计学,到底是个啥?
  20. 虚幻引擎 服务器作用_虚幻引擎5会在下一代平台上发挥作用吗?

热门文章

  1. 音视频出海,如何乘风破浪?
  2. 计算机网络常见问题总结
  3. 5G领衔,十余名专家解析当下最火的“新基建”
  4. 腾讯朱华:数据中心下一个风向的探索
  5. C++之TR1::function
  6. 初学者如何选择合适的机器学习算法(附算法速查表)
  7. linux编译openssl
  8. 无招胜有招之spring _高频面试题
  9. 解决idea maven的导入依赖过慢
  10. 【Redis】新浪微博与微信Redis架构实战 - 笔记