【问题标题】:How signals work信号如何工作
【发布时间】:2014-08-25 16:49:58
【问题描述】:

我一直在研究信号,但我想了解它们是如何工作的,我需要对这个问题有一些深入的回答

例如,如果一个进程使用 libc 函数向另一个进程发送信号。

1-这个进程可以在不进入内核空间的情况下正常发送信号还是要发送信号时必须进入内核空间?

2-如果它必须首先进入内核,要采取哪些步骤来做到这一点?

3-这些信号处理程序在哪里?它们存在于用户空间还是内核空间,默认信号处理程序呢?

4-进程何时收到信号?是否必须通过内核才能执行信号处理程序?

【问题讨论】:

  • 如果应用程序的信号处理程序是“在内核中”,那么在任何 unix 系统上基本上都是零安全性,因为每个应用程序都可以通过将代码注入内核空间来将其设为信号处理程序。实际的信号发送机制在内核中,但实际的处理程序仍保留在它应该在的位置 - 用户空间。
  • 我知道大多数信号处理程序都存在于用户空间中,但有没有例外?
  • 不知道内核内部是否有任何信号使用。可能是,但我不确定这有什么必要,因为信号更多的是用于进程间的东西,而不是进程内的。
  • 我认为定时器中断信号会在内核中。

标签: linux unix signals


【解决方案1】:
  • 1 发送信号最终由系统调用完成。所有系统调用都由内核执行。

  • 2 不确定您想深入多深。第一步是让内核确保您被允许发送信号,最后一步是让内核自己处理或将信号传递给目标进程。

  • 3 大多数信号处理程序都在用户空间中,但内核考虑的 SIGSTOP 和 SIGKILL 除外。

  • 4 不,没有这样的要求。该过程要么忽略或处理信号。处理程序是默认的或自定义的。

【讨论】:

  • 确定如果信号和 sigaction 系统调用不将信号处理程序写入内核,它们是如何工作的
  • 不确定“将信号处理程序写入内核”是什么意思。信号处理程序留在用户态,它是用户态代码,而不是内核代码。 signalsigaction 都在更新作为进程上下文一部分的表。发送到进程的信号也存储在此进程上下文中。当调度程序将 CPU 交还给进程时,它会检查是否需要传递信号。在这种情况下,目标进程可能会执行自定义处理程序。
猜你喜欢
  • 2010-11-16
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 2020-07-28
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多