选择并轮询系统调用。很多写事件问题

问题描述 投票:0回答:1

我有一个服务器/客户端的设置,彼此之间有很多连接。数据被大量发送。

select
poll
系统调用返回许多文件描述符,表示“准备好写入”。但是,当我继续写入数据时,最终,使用 Nth 文件描述符,我得到 EAGAIN,写入的字节数为零。这种情况在很大程度上仍在持续。
据我目前了解,它是内部内核缓冲区,已被填满。因此,其余文件描述符在 

syscall

唤醒时不会收到任何发送的数据。

我的问题是,所有文件描述符是否都以公平的方式发出信号?我的意思是,从文件描述符的总数中,第一组收到信号并移动到 

available for write

队列的 tail。如果没有,那么如何克服上述问题,如何使所有需要数据传输的套接字都得到相当多的关注? 作为一个问题的结果,如果

EAGAIN

开始出现,我可以跳过事件循环吗?

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

c linux sockets freebsd posix-select
1个回答
0
投票
我的问题是,所有文件描述符是否都以公平的方式发出信号?

poll

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

EAGAIN

EWOULDBLOCK
对于任何非阻塞且没有缓冲区空间的描述符。每个 fd 都有自己的缓冲区,因此一个 fd 上发生的这种情况不会影响任何其他 fd,并且它们可能仍然是可写的。
    

© www.soinside.com 2019 - 2024. All rights reserved.