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,可以选择读取固定的长度即可。如果一直试图将一个套接字数据读取完,可能导致其它的套接字饥饿。

posted @ 2022-03-30 14:07  核心已转储  阅读(354)  评论(0)    收藏  举报