以下代码片段调用该select()
函数。
n = select(max_fd, NULL, &write_set, NULL, NULL)
检查某些套接字的写入可用性。由于这些套接字通常可用,因此不设置超时。在某些循环迭代中,套接字可能write_set
为空。
下面是跟踪信息。没有进一步的输出,所以我假设程序挂了。
select(7, NULL, [], NULL, NULL
我的问题是:这是正确的行为吗?如果集合为空,select 应该立即返回吗?没有理由等待select()
,对吧?
是的,这是正确的行为。POSIX说
如果没有指定 FD,那么“对于至少一个指定的文件描述符为真”永远不会为真,因此它会阻塞直到超时。
空的 FD 集实际上与为该集合传递空指针相同。
这实际上是POSIX (IEEE Std 1003.1-2024)中指定的行为:
由于任何集合中都没有文件描述符并且没有超时,因此它必须阻塞直到被中断。