我正在将音频混音器从 Windows 上的 directsound 移植到 Linux 上的 alsa。我正在使用系统调用“poll”轮询 16 个文件描述符。现在我需要能够以某种方式中止轮询。在 Windows 上,我使用 WaitForMultipleObjects 使用事件,当我需要中止等待时,我只需在导致等待返回的事件之一上设置事件。有没有办法在 Linux 中将文件描述符标记为“就绪”以便轮询返回?
我已经查看了 ppoll,但我不熟悉信号,并且我不想处理不必要的竞争条件。我的意思是,如果 alsa 可以将文件描述符设置为“就绪”,我也应该能够;)
如果您使用
pipe()
函数创建管道,则可以将输出端添加到 poll()
列表中。然后你可以在管道的输入端写入一些内容,你的轮询就会返回。很像您的 Windows 版本。
您需要使用异步的东西(例如线程或信号处理程序)才能使其工作。
另一种选择是使用
sigaction()
设置信号处理程序 而不使用 SA_RESTART
标志。您可以使用未使用的信号,例如
SIGUSR1
或实时信号之一。当您想中断
poll()
时,您发送该信号,
poll()
将返回 -1 并将 errno 设置为 EINTR。不同的信号也可能会中断您的
poll()
,除非您使用
sigmask()
来阻止不需要的信号。
while (not exit_condition):
int poll(struct pollfd *fds, nfds_t nfds, int timeout);