【问题标题】:Can the send_sig() function sleep in Linux?send_sig() 函数可以在 Linux 中休眠吗?
【发布时间】:2020-02-08 22:48:29
【问题描述】:

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

【问题讨论】:

  • 我会查看内核中现有的使用情况。 kernel-internal 的合同非常没有充分记录,但是如果您发现内核中的其他地方依赖它(或您可以使用类似的接口代替它)与原子相同上下文,那么您可以得出结论,您也可以这样做。用于处理致命错误条件、OOM 处理程序等的代码将是不错的地方。

标签: c linux process linux-kernel signals


【解决方案1】:

快速浏览源代码(v4.20):

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2012-04-12
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多