send_sig() 函数可以在 Linux 中休眠吗?
Can the send_sig() function sleep in Linux?
我可以安全地使用内核模式中的send_sig()
函数从原子上下文中向进程发送信号吗]?
换句话说,这个功能可以阻塞还是休眠?
快速查看源代码 (v4.20):
send_sig()
只调用 send_sig_info()
...
- ... 检查信号值是否有效然后调用
do_send_sig_info()
...
- ... 调用
lock_task_sighand()
...
- ...具有锁定spinlock
tsk->sighand->siglock
的功能(通过spin_lock_irqsave()
)。此自旋锁仅在 do_send_sig_info()
结束时释放,然后立即 returns。
我们知道内核代码在持有自旋锁时不能休眠,因为那将是一个致命错误。由于 send_sig()
完成的第一个调用链具有锁定自旋锁的效果,然后在整个操作过程中保持该自旋锁,我们可以推断 send_sig()
函数不会睡觉.
我可以安全地使用内核模式中的send_sig()
函数从原子上下文中向进程发送信号吗]?
换句话说,这个功能可以阻塞还是休眠?
快速查看源代码 (v4.20):
send_sig()
只调用send_sig_info()
...- ... 检查信号值是否有效然后调用
do_send_sig_info()
... - ... 调用
lock_task_sighand()
... - ...具有锁定spinlock
tsk->sighand->siglock
的功能(通过spin_lock_irqsave()
)。此自旋锁仅在do_send_sig_info()
结束时释放,然后立即 returns。
我们知道内核代码在持有自旋锁时不能休眠,因为那将是一个致命错误。由于 send_sig()
完成的第一个调用链具有锁定自旋锁的效果,然后在整个操作过程中保持该自旋锁,我们可以推断 send_sig()
函数不会睡觉.