中止 Linux 轮询

问题描述 投票:0回答:3

我正在将音频混音器从 Windows 上的 directsound 移植到 Linux 上的 alsa。我正在使用系统调用“poll”轮询 16 个文件描述符。现在我需要能够以某种方式中止轮询。在 Windows 上,我使用 WaitForMultipleObjects 使用事件,当我需要中止等待时,我只需在导致等待返回的事件之一上设置事件。有没有办法在 Linux 中将文件描述符标记为“就绪”以便轮询返回?

我已经查看了 ppoll,但我不熟悉信号,并且我不想处理不必要的竞争条件。我的意思是,如果 alsa 可以将文件描述符设置为“就绪”,我也应该能够;)

linux file-descriptor abort
3个回答
4
投票

如果您使用

pipe()
函数创建管道,则可以将输出端添加到
poll()
列表中。然后你可以在管道的输入端写入一些内容,你的轮询就会返回。很像您的 Windows 版本。

您需要使用异步的东西(例如线程或信号处理程序)才能使其工作。

另一种选择是使用

sigaction()
设置信号处理程序 而不使用 SA_RESTART
 标志。您可以使用未使用的信号,例如 
SIGUSR1
 或实时信号之一。当您想中断 
poll()
 时,您发送该信号,
poll()
 将返回 -1 并将 errno 设置为 EINTR。

不同的信号也可能会中断您的

poll()

,除非您使用 
sigmask()
 来阻止不需要的信号。


0
投票
一种解决方案,类似于管道建议,是使用 Linux 的 eventfd。这种类型的描述符对于向轮询循环添加中止机制非常方便。

请参阅手册页:

https://man7.org/linux/man-pages/man2/eventfd.2.html

任何其他具有描述符可见性的线程(直接或以其他方式)都可以触发对 eventdfd_write() 的调用,这将在轮询循环中引发 POLLIN 事件。当您捕获该事件时,您可以调用 eventfd_read() 并以您需要的任何方式退出循环。


-1
投票
使用超时并检查退出条件。

while (not exit_condition): int poll(struct pollfd *fds, nfds_t nfds, int timeout);
    
© www.soinside.com 2019 - 2024. All rights reserved.