【问题标题】:How to wait inside SIGABRT signal handler如何在 SIGABRT 信号处理程序中等待
【发布时间】:2023-03-28 12:09:01
【问题描述】:

我有一个 SIGABRT 的信号处理程序,当收到信号时,我需要更多时间让其他线程正常退出。然后我将在信号处理程序中执行 _exit() 以退出整个过程。

但我不确定如何在信号处理程序中等待。我认为在信号处理程序中使用睡眠有一些限制。我不想使用忙等待。

有人建议有什么想法吗?

【问题讨论】:

    标签: c linux pthreads signals


    【解决方案1】:

    您可以在信号处理程序中执行何种代码没有任何限制。您只需要记住,在执行信号处理程序时可能会到达另一个信号,从而使您处于一半完成的函数、锁定的互斥锁或其他最好保持不间断的事情的中间。

    通常,您会让信号处理程序设置一个标志,向所有线程发出信号以正常退出,从信号处理程序返回,然后让您的代码正常退出。

    【讨论】:

    • SIGABRT 中的 usleep() 让它永远挂起!
    • 在信号处理程序中使用 usleep() ,哪个线程将进入睡眠状态?或者信号处理程序会进入休眠状态?
    • @LunarMushrooms 正在执行信号处理程序的线程将休眠。它可能永远处于休眠状态的原因是因为其他信号可能会同时到达,从而中断该休眠并让线程执行其他操作。哪个线程将处理信号完全取决于操作系统的实现,通常它是随机的。
    • usleep() 之前和之后有两个打印,usleep() 之前的一个正在出现。但是usleep() 之后的那个没有出现()。这意味着 usleep() 没有被中断,对吧?
    • @LunarMushrooms 这可能意味着任何事情。使用调试器找出到底发生了什么。调试器将能够告诉您线程到底在做什么,然后您可能会找出原因。
    猜你喜欢
    • 1970-01-01
    • 2019-08-04
    • 2012-02-14
    • 1970-01-01
    • 2017-09-15
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    相关资源
    最近更新 更多