3

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

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

4

2 回答 2

3

如果使用该pipe()函数制作管道,则可以将输出端添加到poll()列表中。然后你可以在管道的输入端写一些东西,你的投票就会返回。很像您的 Windows 版本。

你需要使用一些异步的东西,比如线程或信号处理程序来完成这项工作。

另一种选择是用于设置没有标志的sigaction()信号处理程序。您可以使用未使用的信号或实时信号之一。当您想中断时,您发送该信号并将返回 -1 并将 errno 设置为 EINTR。SA_RESTARTSIGUSR1poll()poll()

不同的信号也可能会干扰您poll(),除非您曾经sigmask()阻止不需要的信号。

于 2010-10-29T04:47:30.020 回答
-1

使用超时并检查退出条件。

while (not exit_condition):
    int poll(struct pollfd *fds, nfds_t nfds, int timeout);
于 2010-10-29T04:30:22.010 回答