c-选择并轮询系统调用.许多写事件的问题



我有一个服务器/客户端的设置,该服务器/客户端之间有许多连接。大量发送的数据。selectpoll系统调用返回许多文件描述符,因为正准备写入。但是,当我继续写入数据时,最终,使用Nth文件描述符,我得到了EAGAIN,写入了零个字节。这种情况在很大程度上仍在继续。

正如我现在所理解的,它是内部内核缓冲区,被填满了。因此,其余的文件描述符在syscall唤醒时不会得到发送的数据。

我的问题是,是否所有文件描述符都以公平的方式发出信号?我的意思是,从文件描述符的总数来看,第一组得到信号,并被移动到可用于写入队列的尾部。如果没有,那么如何克服上述问题,如何做到这一点,使所有需要数据传输的套接字都能得到相当多的关注?

作为一个问题的结果,如果EAGAIN开始出现,我可以跳过事件循环吗?

我用C语言编写程序,欢迎参考代码和解释。

我的问题是,是否所有文件描述符都以公平的方式发出信号?

pollselect都将返回关于哪些文件描述符在调用返回时当前可读写的信息。这是";"公平";因为它们都是同时指示的。您将需要遍历所有描述符,并写入每个可写的描述符。如果你愿意,你可以决定选择一些而不是其他,或者安排你的循环更加公平。

当您将write添加到描述符时,它将为任何一个非阻塞且没有缓冲区空间的描述符返回EAGAINEWOULDBLOCK。每个fd都有自己的缓冲区,所以发生在一个fd上的情况与任何其他fd都没有关系,它们可能仍然是可写的。

最新更新