为什么使用select()而不是sleep()?

我正在编写一个关于iPhone音频的章节,并且遇到了一段我无法理解的代码:

while (aqc.playPtr < aqc.sampleLen) { select(NULL, NULL, NULL, NULL, 1.0); } 

( 完整代码示例在第163-166页 )。 根据我对代码的理解,音频正在另一个线程上处理,而while循环就是为了防止主线程在音频仍在处理时终止。

我不明白为什么使用select()而不是sleep()

从我读过的内容中, select()用于监视I / O的变化并传递它.NULLs没有做任何有意义的事情。 我使用sleep()运行代码,它按预期工作。 (我对低级别POSIX的了解几乎不存在。)

选择允许准确的次秒等待,并且比睡眠更便携。 还有其他方法可以等待,请看这个问题 。

但是select的timeout参数不应该是float,而是指向struct timeval的指针。 我对你展示的代码甚至编译感到惊讶。 更多:这个奇怪的条件选择之后是无条件睡眠(1)。 对我来说看起来毫无意义。

使用带有NULL rfds select()wfdsefds是以亚秒级分辨率efds睡眠的惯用方式。

那么,睡眠(3)可以通过使用信号来实现。 这取决于平台。

当您使用select(2)和poll(2)时,您知道不会涉及任何信号,这通常非常有用。 例如,如果你正在使用alarm(2),你也不应该使用sleep(3),因为“混合调用警报和睡眠是一个坏主意”(根据手册页。)

此外,select和poll在睡眠时会给你毫秒级的粒度,但是睡眠只有几秒钟的粒度。

当您在应用程序中使用SIGALM信号并使用(u)sleepfunction时,当SIGALRM发生时程序立即从睡眠function返回,因此最好的睡眠方式是等待selectfunction。

 struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 1000; do { ret = select(1, NULL, NULL, NULL, &tv); } while((ret == -1)&&(errno == EINTR)); //select is interruped too 

没有理由这样做。 也没有理由睡觉()。 一个人应该总是期待至少一个事件 – 程序关闭请求。