【问题标题】:C write async unsafe code in signal handlerC在信号处理程序中编写异步不安全代码
【发布时间】:2021-05-11 13:41:22
【问题描述】:

如何在信号处理程序中运行异步不安全代码。在我的情况下,我不能使用标志。我可以使用 longjmp 跳转到不同的上下文吗?

【问题讨论】:

  • 您在寻找semaphore 吗? “sem_post() 是异步信号安全的:它可以在信号处理程序中安全地调用。”
  • 我需要的是 pthread_mutex_lock 和 pthread_cond_signal
  • 唉,“因此,互斥锁和条件变量不适合通过信号处理程序中运行的代码发出信号来释放等待线程。”。也许 semaphore + pthread_mutex 那么?
  • 我找到了解决方案。冻结的线程在等待时不需要高效
  • 对于您的问题,关于 longjump 的 ISO C:“由于它绕过了通常的函数调用和返回机制,longjmp() 应在中断、信号及其任何上下文中正确执行关联的函数。但是,如果从嵌套的信号处理程序(即,从作为在处理另一个信号期间引发的信号的结果调用的函数)调用 longjmp(),则行为未定义。"。因此,信号中的 OK,但不要嵌套。

标签: c signals


【解决方案1】:

在信号处理程序中,您只能使用一组安全函数,在许多情况下,这对于在处理程序中启动的复杂功能来说已经足够了。您可以查看系统手册页中的“信号安全”或类似信息。这是网上的一个指针:https://man7.org/linux/man-pages/man7/signal-safety.7.html

pthread 同步函数不在列表中。

但是,其中列出的功能之一是 sem_post: https://man7.org/linux/man-pages/man3/sem_post.3.html

sem_post() 是异步信号安全的:它可以在一个 信号处理程序。

因此,您可以在信号处理程序中使用信号量来实现类似互斥锁的同步。

【讨论】:

  • 从信号处理程序发送信号量单元是否会触发“立即”调度/调度,以便将等待线程设置为就绪/运行?
  • @MartinJames,这可能值得一个单独的问题。 sem_post 只是以原子方式递增/递减计数器。它可能会或可能不会立即唤醒其他线程,可能不会。可能取决于实现、信号的类型、捕获信号的线程和其他因素,如信号屏蔽。
猜你喜欢
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多