Source#1(Andries Brouwer)对于单线程进程是正确的 . 源#2(SCO Unix)对于Linux是错误的,因为Linux不喜欢sigwait中的线程(2) . 关于第一个可用的线程,Moshe Bar是正确的 .

Which thread gets the signal? Linux的手册页是一个很好的参考 . 进程使用带有CLONE_THREAD的clone(2)来创建多个线程 . 这些线程属于"thread group"并共享一个进程ID . 克隆手册(2)说,

可以使用kill(2)将信号作为整体(即,TGID)发送到线程组,或者使用tgkill(2)发送到特定线程(即,TID) . 信号处理和操作在整个过程中:如果未处理的信号被传递给线程,那么它将影响(终止,停止,继续,被忽略)线程组的所有成员 . 每个线程都有自己的信号掩码,由sigprocmask(2)设置,但信号可以是挂起的:对于整个进程(即,可传递给线程组的任何成员),当与kill(2)一起发送时;或者与tgkill(2)一起发送的单个线程 . 对sigpending(2)的调用返回一个信号集,该信号集是整个过程中待处理的信号和为调用线程挂起的信号的并集 . 如果使用kill(2)向线程组发送信号,并且线程组已经为信号安装了一个处理程序,那么将在没有阻塞该线程组的线程组中任意选择的一个成员中调用该处理程序 . 信号 . 如果组中的多个线程正在等待使用sigwaitinfo(2)接受相同的信号,则内核将任意选择其中一个线程来接收使用kill(2)发送的信号 .

Linux不是SCO Unix,因为Linux可能会向任何线程发出信号,即使是某些线程线程正在等待信号(使用sigwaitinfo,sigtimedwait或sigwait),而某些线程则没有 . sigwaitinfo(2)的手册警告说,

在正常使用中,调用程序通过事先调用sigprocmask(2)来阻塞set中的信号(这样,如果它们在连续调用sigwaitinfo()或sigtimedwait()之间变为挂起,则不会发生这些信号的默认处置)并且不为这些信号 Build 处理程序 . 在多线程程序中,应该在所有线程中阻塞信号,以防止信号在调用sigwaitinfo()或sigtimedwait()之外的线程中根据其默认处置进行处理 .

为信号选择线程的代码位于linux/kernel/signal.c(链接指向GitHub 's mirror). See the functions wants_signal() and completes_signal(). The code picks the first available thread for the signal. An available thread is one that doesn' t阻塞信号并且队列中没有其他信号 . 代码首先检查主线程,然后检查其他线程如果没有线程可用,那么信号会被卡住,直到某个线程解除阻塞信号或清空其队列 .

What happens when a thread gets the signal? 如果有信号处理程序,则内核会使线程调用处理程序 . 大多数处理程序在线程堆栈上运行 . 如果进程使用sigaltstack(2)提供堆栈,则处理程序可以在备用堆栈上运行,而使用SA_ONSTACK sigaction(2)来设置处理程序 . 内核将一些东西推到所选的堆栈上,并设置一些线程的寄存器 .

要运行处理程序,该线程必须在用户空间中运行 . 如果线程在内核中运行(可能是系统调用或页面错误),那么在它进入用户空间之前它不会运行处理程序 . 内核可以中断一些系统调用,因此线程现在运行处理程序,而不等待系统调用完成 .

信号处理程序是一个C函数,因此内核遵循体系结构调用C函数的约定 . 每个架构,如arm,i386,powerpc或sparc,都有自己的约定 . 对于powerpc,要调用handler(signum),内核将寄存器r3设置为signum . 内核还将处理程序的返回地址设置为信号trampoline . 返回地址按照惯例进入堆栈或寄存器 .

内核在每个进程中放置一个信号trampoline . 这个trampoline调用sigreturn(2)来恢复线程 . 在内核中,sigreturn(2)从堆栈中读取一些信息(如保存的寄存器) . 在调用处理程序之前,内核已将此信息推送到堆栈上 . 如果系统调用中断,内核可能会重新启动调用(仅当处理程序使用SA_RESTART时),或者使用EINTR失败,或者返回短读或写 .

linux调用信号处理程序后返回,如何在Linux上执行异步信号处理程序?相关推荐

  1. 如何在QEMU上执行iOS并启动一个交互式bash shell,内含整个安装流程并且提供了相关工具(二)

    我们在上一篇文章中介绍如何在QEMU上执行iOS并启动一个交互式bash shell,在第这篇文章中,我们将详细介绍为实现这些目标所进行的一些具体的项目研究. 本文的研究项目是以该项目为基础进行的,我 ...

  2. Linux怎么给命令创建别名,如何在Linux上创建别名和Shell函数 | MOS86

    使用别名和Bash Shell函数创建自己的Linux命令. 驯服重复性任务,截断冗长的进程,并使用您经常使用且难以记住的选项配置标准命令. 别名和Shell脚本是Linux和类似Unix的操作系统中 ...

  3. linux怎么修改sftp默认端口,如何在 Linux 系统中如何更改 SFTP 端口

    SFTP(SSH文件传输协议)是一种安全文件协议,用于通过加密连接在两个主机之间传输文件. 它还允许您对远程文件执行各种文件操作并恢复文件传输. SFTP可以替代旧版FTP协议. 它具有FTP的所有功 ...

  4. linux中终止停止进程_如何在Linux中终止进程或停止程序

    linux中终止停止进程 当一个进程行为异常时,您有时可能想要终止或终止它. 在本文中,我们将探讨几种使用gedit作为示例应用程序从命令行以及图形界面终止进程或应用程序的方法. 使用命令行/终止符 ...

  5. linux中设置环境变量_如何在Linux中设置环境变量

    linux中设置环境变量 Wondering how to set environment variables in Linux? This is exactly what we'll be doin ...

  6. linux 线程迁移_迁移线程如何在Linux内核内部工作

    linux 线程迁移 Abstract In computer systems, resources have to be balanced so that the performance will ...

  7. 在linux系统中进行路由探测,如何在Linux操作系统中运行Traceroute命令?

    Traceroute是Linux操作系统中的命令工具,可用于查看网络数据包的路由.Traceroute可以帮助确定网络数据包传输的质量好坏,同时对于排除缓慢的网络连接故障也很有用. 在租用 关于Tra ...

  8. sigterm信号_详解如何在 docker 容器中捕获信号

    概述 玩过docker的朋友可能都使用过 docker stop 命令来停止正在运行的容器,有些会使用 docker kill 命令强行关闭容器或者把某个信号传递给容器中的进程.这些操作的本质都是通过 ...

  9. linux 连接两个异构网,如何在Linux(或异构)网络上共享计算机?

    在有关共享计算机的这两篇文章中的第 1 部分中,我描述了我的异构本地网络以及如何使用它来比较和测试不同操作系统和体系结构上的应用程序.有几种技术使一台工作站上的用户可以运行位于另一台工作站上的应用程序 ...

最新文章

  1. 只要7天 传统便利店就能免费升级无人超市
  2. Linux(debian)的网络内核参数优化来提高服务器并发处理能力
  3. 认识DOM的三大节点:元素节点,文本节点,属性节点以及nodeName,nodeType,nodeValue的区别
  4. Dubbo 源码分析 - 服务导出
  5. Codeforces 997E Good Subsegments (线段树)
  6. python 画系统关联图_Python基于pyecharts实现关联图绘制
  7. getlong_Java LocalDateTime类| 带示例的getLong()方法
  8. LeetCode(595)——大的国家(MySQL)
  9. serve注解是加在哪个类_不会 Java 注解 ? 看这一篇文章!
  10. oracle的事物起始于,oracle 学习笔记(十) 事务控制语句
  11. matlab isnumeric函数,matlab中isnan函数
  12. vs python调试配置_想用Python编程却不知如何下手?一篇搞定编程准备工作
  13. C++ 类的隐式转换之基本数据类型
  14. teighax是什么_cut up,cut in,cut off,cut down有什么区别?
  15. C#chart控件初始化
  16. python tkinter界面 多进程启动scrapy爬取百度贴吧的回复,显示爬取进度,并可以搜索回帖人,指定时间生成词云图,用pyinstaller打包成exe(七)
  17. 天勤python_天勤量化策略库:网格交易策略(难度:中级)
  18. android 夜间模式代码,Android 超简单的夜间模式如何实现?
  19. mySQL下载后的初次使用
  20. 巧用c语言风格的多行注释/**/

热门文章

  1. pytorch基础知识整理(五) 优化器
  2. 2020年度「炼丹笔记」搜索推荐系统干货集锦
  3. 网易云信项望烽:开源最初都是被动的
  4. LeetCode_226.翻转二叉树
  5. Cobbler Web界面提示报错 “Internal Server Error”
  6. C#借助API实现黑盒自动化测试工具的编写
  7. Linux下全局安装composer方法
  8. WebSocket和Socket
  9. 《Abaqus GUI程序开发指南(Python语言)》——第一章 概述1.1 简单插件实例——创建带孔板有限元模型...
  10. 2017蓝桥杯:承压计算