send_sig() 函数可以在 Linux 中休眠吗?

Can the send_sig() function sleep in Linux?

我可以安全地使用内核模式中的send_sig()函数从原子上下文中向进程发送信号吗]?
换句话说,这个功能可以阻塞还是休眠?

快速查看源代码 (v4.20):

  1. send_sig() 只调用 send_sig_info()...
  2. ... 检查信号值是否有效然后调用 do_send_sig_info()...
  3. ... 调用 lock_task_sighand()...
  4. ...具有锁定spinlocktsk->sighand->siglock的功能(通过spin_lock_irqsave())。此自旋锁仅在 do_send_sig_info() 结束时释放,然后立即 returns。

我们知道内核代码在持有自旋锁时不能休眠,因为那将是一个致命错误。由于 send_sig() 完成的第一个调用链具有锁定自旋锁的效果,然后在整个操作过程中保持该自旋锁,我们可以推断 send_sig() 函数不会睡觉.