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

时间:2012-02-29 04:17:39

标签: c linux unix signals

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

4 个答案:

答案 0 :(得分:5)

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

当然,C标准本身对“用户”和“内核”一无所知。

答案 1 :(得分:4)

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:0)

内核可以向用户空间发送信号,但反之亦然,要发送的数据量非常有限,信号处理程序在用户空间中运行。

说明:

为了能够从内核空间向用户空间发送信号,内核需要知道用户空间进程的pid。一旦内核模块接收到pid,它就会查找相应的进程描述符,并向其发送信号。与信号相关的所有信息都保存在struct siginfo

用户空间进程向内核注册信号处理函数。这会将信号处理函数的地址添加到进程描述符中。每次传送特定信号时都会执行此功能。