【发布时间】: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 教程?