当多个信号到达一个进程时,处理这些信号的进程之间的顺序是什么?

2024-02-27

当多个信号到达一个进程时,处理这些信号的进程之间的顺序是什么?

使用什么数据结构来存储已到达进程但尚未传递的信号?

例如,来自 APUE

由于当父进程终止时进程组将成为孤立进程,因此 POSIX.1 要求向新孤立进程组中停止的每个进程(就像我们的子进程一样)发送挂起信号 (SIGHUP)其次是继续信号(SIGCONT)

这使得孩子能够继续,after处理挂断信号。这 挂断信号的默认操作是终止进程,所以我们必须 提供一个信号处理程序来捕获信号。因此我们期望 printf 在 sig_hup 函数出现在 pr_ids 函数中的 printf 之前。

As SIGCONT 和 SIGHUP 的顺序发送到孤立的 linux 进程组 https://stackoverflow.com/a/17769300/156458 says:

在子进程恢复执行之前,无法传递 SIGHUP。 当进程停止时,除了 SIGCONT 和 SIGKILL。

所以,SIGHUP 确实到来了first,但无法处理until这 SIGCONT 唤醒进程执行。

SIGHUP之前到达SIGCONT在停止的过程中。SIGHUP无法交付SIGCONT can be.

Is SIGCONT之前或之后处理SIGHUP?第一个引用似乎说“之后”,而第二个引用似乎说“之前”和“直到”。

如果“之前”:

  • How can SIGCONT被安排跳到前面SIGHUP交付?

  • How can SIGHUPSIGCONF在交付之前跳跃?

上面是不是基于一些数据结构如FIFO队列或者FILO栈来实现的?

Thanks.


这种情况可能会因不同的实现和 POSIX 实时信号的引入而变得混乱。信号(7) http://man7.org/linux/man-pages/man7/signal.7.html说实时信号与旧式信号的区别在于

实时信号以有保证的顺序传送。多种的 同一类型的实时信号按顺序下发 他们被派去。如果不同的实时信号发送到 过程中,它们从编号最小的开始交付 信号。 (即,编号低的信号具有最高优先级。) 相反,如果一个进程有多个标准信号待处理, 它们的交付顺序未指定。

正如 Bach 的《Unix 操作系统的设计》中描述的旧式信号(在引入 POSIX 实时信号之前)。

为了向进程发送信号,内核会在进程表条目的信号字段中设置一个位,该位与收到的信号类型相对应。 ...当进程从内核模式返回到用户模式时以及当它以适当低的信号优先级离开睡眠状态时,内核检查是否收到信号。

您可以在以下位置查看一些当前的 Linux 数据结构:sched.h https://github.com/torvalds/linux/blob/master/include/linux/sched.h。看着这个,我怀疑旧式位图已经消失,位图和链表的组合用于处理旧式和 POSIX 实时信号,但我还没有浏览足够的代码来确定这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当多个信号到达一个进程时,处理这些信号的进程之间的顺序是什么? 的相关文章

  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • Composer 安装要求

    我正在尝试将 Composer 安装到 Laravel 项目中 当我做的时候sudo composer install在项目目录中它显示了两个错误 Problem 1 Installation request for simplesoftw
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 分而治之策略来确定列表中是否有超过 1/3 的相同元素

    我正在使用分治算法来确定列表中是否有超过 1 3 的元素相同 例如 1 2 3 4 不 所有元素都是唯一的 1 1 2 4 5 是的 其中 2 个是相同的 没有排序 是否有分而治之的策略 我陷入了如何划分的困境 def is valid i
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • 使用多级解决方案计算二维网格中的最近邻

    我有一个问题 在 x y 大小的网格中 我提供了一个点 并且我需要找到最近的邻居 在实践中 我试图在 pygame 中找到距离光标最近的点 该点跨越颜色距离阈值 计算如下 sqrt rgb1 0 rgb2 0 2 rgb1 1 rgb2 1
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 如何有效地找到距给定点最远的点(从一组点中)?

    我正在寻找一种算法或数据结构来解决以下问题 给你一组点 S 然后你会得到另一个点形式的 Q 查询 对于每个查询 找到集合中距离给定点最远的点 集合中最多有 10 5 个点和 10 5 个查询 所有点的坐标都在 0 到 10 5 范围内 我想
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 使用 sigaction(),c

    我正在读一些关于sigaction 来源来自我的课程笔记 我不确定我是否理解这段文字 信号掩码仅在以下持续时间内计算和安装 信号处理程序 默认情况下 信号 sig 发生时也会被阻塞 使用 sigaction 为特定信号安装操作后 它会保持安
  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案

随机推荐