Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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
使用I/O多路复用时,select()何时返回_C_Concurrency_Event Based Programming - Fatal编程技术网

使用I/O多路复用时,select()何时返回

使用I/O多路复用时,select()何时返回,c,concurrency,event-based-programming,C,Concurrency,Event Based Programming,我不熟悉C和I/O多路复用,只是关于select()的一个问题 根据select():允许程序监视多个文件描述符,等待至少一个或多个文件描述符为某类I/O操作“准备就绪”。返回值是就绪描述符的计数。我对返回值有点困惑 假设一个并发web服务器使用select(),有两个客户端(连接文件描述符)连接到服务器。如果客户机A正在编写sth,而客户机B尚未编写,当然select()返回1并修改fdset 但是我看到一些代码使用了select(),当多个文件描述符就绪时,它可以返回,这意味着select(

我不熟悉C和I/O多路复用,只是关于
select()
的一个问题

根据
select()
:允许程序监视多个文件描述符,等待至少一个或多个文件描述符为某类I/O操作“准备就绪”。返回值是就绪描述符的计数。我对返回值有点困惑

假设一个并发web服务器使用
select()
,有两个客户端(连接文件描述符)连接到服务器。如果客户机A正在编写sth,而客户机B尚未编写,当然
select()
返回1并修改
fdset

但是我看到一些代码使用了
select()
,当多个文件描述符就绪时,它可以返回,这意味着
select()
可以返回2,3,…,等等

我的问题是:

从我的理解中,<代码>选择()/代码>当一个FD可用以避免阻塞时应该尽快返回,因此如果<代码>选择()/代码>可以检测到一个以上的FD,并且认为每个FD不会同时在Excel中就绪(例如,第一个FD准备在1.0,第二个已经准备好了1.1S,它们不能在1.0时准备就绪)。那么,

select()
如何知道当第一个fd准备就绪时它重新输入时,它不应该立即返回,而是等待下一个fd准备就绪?既然
select()
无法预测,它怎么知道会有第二个就绪fd


select()
的基本机制是,在第一个fd准备就绪之前,它将被阻止,然后等待预定义的时间,以确保在超时之前它可以捕获其他读取fd,这样
select()
至少可以返回1?

两者都不能返回。在您的示例中,
select
将在1.0秒后返回,报告第一个fd已就绪,而第二个fd未就绪。它只等待至少一个给定的文件描述符准备就绪。@NateEldredge但我看到了
select
return2,3,4…等代码,它是如何实现的?在第一个fd准备就绪的时间和下一个进程计划的时间之间不可避免地会有延迟(同时可能正在运行其他进程)。在此期间,其他FD可能已准备就绪,在这种情况下,select将返回所有FD。但它不会故意等待更长时间,希望有更多FD准备就绪。@NateEldredge哦,我明白了,非常感谢您的回答。