为特定信号指定用户定义的处理函数。在接收到该信号时,调用处理函数。处理程序函数是在用户空间还是内核空间中运行? 或者通常在用户空间或内核空间中执行任何信号的动作?
答案 0 :(得分:5)
处理程序在用户空间中运行,只能访问进程的虚拟地址空间。
当然,C标准本身对“用户”和“内核”一无所知。
答案 1 :(得分:4)
信号处理程序必须在用户空间中运行。如果它们在内核空间中运行,它们可以访问整个机器中的任何内容(因为内核可以控制所有进程)。因此,恶意程序很容易通过向自身发送信号来破坏其他程序的内存,窃取数据或更糟糕。
答案 2 :(得分:4)
一般而言,信号在用户空间中执行。但是,由于C语言标准实际上并没有定义用户和内核空间之间的分离,因此可以想象可能存在C语言实现,而实际情况并非如此。
但请注意,在Windows和各种Unix版本中,信号保证在用户空间中运行。
答案 3 :(得分:0)
内核可以向用户空间发送信号,但反之亦然,要发送的数据量非常有限,信号处理程序在用户空间中运行。
说明:
为了能够从内核空间向用户空间发送信号,内核需要知道用户空间进程的pid。一旦内核模块接收到pid,它就会查找相应的进程描述符,并向其发送信号。与信号相关的所有信息都保存在struct siginfo
。
用户空间进程向内核注册信号处理函数。这会将信号处理函数的地址添加到进程描述符中。每次传送特定信号时都会执行此功能。