【问题标题】:Is it possible to prevent signal condensation?是否可以防止信号凝结?
【发布时间】:2015-08-05 08:22:10
【问题描述】:

据我了解,在 Linux 上的 C++ 中,如果多次传递相同的信号,则信号处理程序可能只会被调用一次。是否可以覆盖此行为?例如,假设我有几个文件描述符,并且每当这些文件描述符上有事件时,我希望得到 SIGIO 的通知。所以我用命令F_SETOWN_EX对他们每个人打电话给fcntl。但是如果在 2 个文件描述符上同时发生事件,我可能只得到一个 SIGIO,然后永远不知道另一个文件描述符上发生了事件。

现在我知道你可能想知道我为什么要使用信号,而不是仅仅使用 epoll 或其他东西。问题是我对事件发生的确切时间感兴趣,所以我想从 SIGIO 信号处理程序中调用 clock_gettime 来记录事件的确切时间。

【问题讨论】:

  • 在 Linux 上,您可以使用sigaction 配置信号处理程序,以便在处理程序运行时阻塞信号;信号被传递到一个不阻塞它的线程,或第一个解除阻塞的线程。
  • @Kerrek:所以你是说如果同一个信号被两次发送到我的进程,并且我有 2 个线程不会阻塞它,那么我保证会收到两次信号,也许在不同的线程中?
  • 不,我不是这么说的,或者是故意这么说的。我想说的是,如果您的信号处理程序安装了sigaction 和适当的sa_mask,那么应该为每个传递的信号调用一个信号处理程序。
  • @Kerrek:你知道我可以知道什么时候的任何替代方法吗?例如,数据在套接字上可用?好像epoll 没有给我这些信息。
  • 看来这不仅仅是 X-Y 问题,更像是 X-Z 问题。 Epoll 应该为您提供所需的所有功能,包括信号处理(使用signalfd)。或许可以通过一些小步骤完成一些 epoll 教程?

标签: c++ linux unix signals


【解决方案1】:

老问题,但如果有人仍然想知道:您应该能够通过使用fcntlF_SETSIG 来选择实时信号(信号编号> = SIGRTMIN)来完成您想要的事情,而不是使用默认的SIGIO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多