Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
中止linux轮询_Linux_File Descriptor_Abort - Fatal编程技术网

中止linux轮询

中止linux轮询,linux,file-descriptor,abort,Linux,File Descriptor,Abort,我正在将一个音频混音器从Windows上的directsound移植到Linux上的alsa。我使用系统调用“poll”对16个文件描述符进行轮询。现在我需要能够以某种方式中止轮询。在Windows上,我使用WaitForMultipleObjects使用事件,当我需要中止等待时,我只需在导致等待返回的事件之一上设置事件。有没有办法在Linux中将文件描述符标记为“就绪”,以便轮询返回 我已经看过了ppoll,但我不熟悉信号,我不想处理不必要的比赛条件。我的意思是,如果alsa可以将文件描述符设

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


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

使用超时并检查退出条件

while (not exit_condition):
    int poll(struct pollfd *fds, nfds_t nfds, int timeout);

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

您需要使用一些异步的东西,如线程或信号处理程序来实现这一点

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


除非您使用
sigmask()
阻止不需要的信号,否则其他信号也可能中断您的
poll()

添加超时有什么问题?我不想在用户模式下进行轮询。您能更准确地定义“用户模式”轮询的含义吗?要么编写内核代码,然后不进行系统调用,要么编写用户代码,我看不出轮询有什么问题?也许您的意思是“使用库的应用程序代码”不会使用轮询,但必须能够中断调用?可以随意调用它,但在“用户模式”、“用户区域”、“不在内核中”、“在应用程序中”、“在客户机中”、“bla bla bla”中轮询仍然是一个非常糟糕的主意-因为您一直在强制调度程序切换上下文,导致巨大的开销和糟糕的性能。使用系统调用深入到“内核模式”,使进程真正进入休眠状态,从而最大限度地提高性能并最小化开销。此外,对于超时,我指定了一个绝对延迟时间,它不是我跨平台API的一部分-我相信这应该是实现定义的。我的代码使用一个单独的线程,用于在事件发生时解码音频数据并将其流式传输到directsound/alsa。当未触发任何事件时,使用系统调用(WaitForMultipleObjects/poll)将线程置于睡眠状态,从而最小化不必要的上下文切换。当我想关闭线程或添加更多描述符时,我会中止等待,使其唤醒,然后关闭线程并加入,或者用新描述符“更新”等待。我喜欢使用额外描述符作为退出轮询的方法,但系统调用“ppoll”呢?引用“ppoll()允许应用程序安全地等待,直到文件描述符准备就绪或信号被捕获。”使用ppoll,当我想要中止轮询时,我应该能够发送某种信号,我只是不太了解信号,因为我真的从未使用过它们。嘿,我想我明白了-ppoll有一个掩码,阻止信号而不是我用来中止投票的信号?如果我将0指定为掩码,轮询将不会被任何信号中断,如果我仅为我使用的信号制作掩码,它将仅在我的信号上中止?我想我必须研究信号:)我这样做是为了在流线程信号中中止poll://中断poll(SIGUSR1,ignore_handler);pthread_kill(thread->native_handle(),SIGUSR1);其中ignore_handle是一个接受int的空空格。@Alex解决方案和另一个描述符很好,可以工作。如果你想处理这样的描述符数量,你应该考虑ePube或LiBevin库以获得更好的性能。由于一个竞争条件,用一个信号亚历克斯中断中断()并不是一个好的解决方案。无法确保poll()已被调用(即已进入内核)——因此它实际上将被信号中断——或者在信号处理程序中可靠地阻止poll()被调用。带有附加文件描述符(管道)的解决方案实际上是唯一有效的解决方案。应修改答案。这将是用户模式轮询。