epoll --问题整理与解答
1、如果同时向一个epfd中添加两次一样的描述符会怎么样?
如果相同的文件描述符,epoll_ctl()会返回错误-1,设置错误码 EEXIST。但是如果是使用(dup,dup2,fcntl)创建某个文件的副本描述符,即虽然是同一个文件描述符fd不同。这种情况是可以同时加入的,且两个事件会被同时触发。
2、同一个fd可以同时加入不同的epfd吗?
可以。如果存在事件所有阻塞的epfd都会被唤醒。
3、epfd可以加入到其它的epfd或者select/poll中吗?
不可以。如果epfd中有事件发生,表示这个epfd可读。注意不能回环,深度不能超过5,会返错-1,错误码 ELOOP 。
4、epfd中可以添加自己吗?
不可以。添加时会返回错误-1,错误码EINVAL。
5、可以把epfd发给其它进程使用吗?
不可以。
6、直接关闭epfd,添加的事件都会被自动清除吗?
会。
7、如果在wait时发生多个事件,是合并还是分开上报?
合并上报。即一次wait返回,一个fd只会有一个对应的event。
8、操作一个套接字,是否会影响已经被收集但是还没有被上报的事件?
不会。
9、当设置为边缘触发的时候,是否每次都要read/write,知道返回EAGAIN。
不一定需要。这个一般取决于使用的是什么套接字,如果是包式的如UDP一般都是read到返回EAGAIN。如果是流式的如TCP,可以选择读取固定的长度即可。如果一直试图将一个套接字数据读取完,可能导致其它的套接字饥饿。

浙公网安备 33010602011771号