信号处理程序是在内核还是用户空间中运行?

use*_*355 1 c unix linux signals

为特定信号指定用户定义的处理函数.在接收到该信号时,调用处理函数.处理程序函数是在用户空间还是内核空间中运行?或者通常在用户空间或内核空间中执行任何信号的动作?

cni*_*tar 5

处理程序在用户空间中运行,只能访问进程的虚拟地址空间.

当然,C标准本身对"用户"和"内核"一无所知.


Ada*_*cin 5

信号处理程序必须在用户空间中运行。如果它们在内核空间中运行,则它们可以访问整个机器中的任何内容(因为内核可以控制所有进程)。因此,恶意程序可以通过简单地向自身发送信号来轻松破坏其他程序的内存、窃取数据或更糟的情况。


bdo*_*lan 5

一般来说,信号是在用户空间中执行的。然而,由于 C 语言标准实际上并未定义用户空间和内核空间之间的分离,因此可以想象,可能存在并非如此的 C 语言实现。

但请注意,在 Windows 和所有版本的 Unix 中,信号保证在用户空间中运行。

  • @AdamMihalcin:C语言规范实际上指定了“signal()”和“raise()”函数,以及信号“SIGABRT”、“SIGFPE”、“SIGILL”、“SIGINT”、“SIGSEGV”和“SIGTERM” 。 (3认同)