与epoll联网:错误处理

时间:2014-10-18 10:02:52

标签: c networking epoll

我正在使用Linux epoll工具开发一个用C语言编写的网络应用程序。 我确实正在实现我自己的事件循环,是的,我知道有些库可以帮我这样做。然而,这只是一个练习,而且我想要自己实现事件循环。

我想知道如何处理错误处理,特别是处理epoll系统调用返回的错误。我应该真的检查每个返回值吗?因为,在我看来,e返回的一些错误。 G。 epoll_ctl逻辑错误而不是运行时错误;我的意思是,我唯一一次看到epoll_ctl失败的时候是我不小心给它一个非法的epoll文件描述符或其他只在你编写错误代码时才出现的东西。 所以我的问题是, epoll_ctl 实际上会返回“运行时错误”,比如说, write 管道坏了会怎么办?如果是的话,我应该检查一下吗?我不打算检查指示内核资源耗尽或类似内容的错误(在这种情况下,甚至可以做什么?)。其他问题:当fcntl仅用于设置某些标志(O_NONBLOCK)时,{{1}}会产生某种运行时错误吗?

1 个答案:

答案 0 :(得分:2)

是的,epoll可以返回运行时错误。

从联系手册:

  

错误

     

EBADF epfdfd不是有效的文件描述符。

     

EEXIST op为EPOLL_CTL_ADD,提供的文件描述符fd已在此epoll实例中注册。

     

EINVAL epfd不是epoll文件描述符,或者fdepfd相同,或者此接口不支持请求的操作op。

     

ENOENT操作为EPOLL_CTL_MODEPOLL_CTL_DELfd未在此epoll实例中注册。

     

ENOMEM没有足够的内存来处理请求的操作控制操作。

     

ENOSPC尝试在epoll实例上注册(/proc/sys/fs/epoll/max_user_watches)新文件描述符时遇到EPOLL_CTL_ADD强加的限制。有关详细信息,请参阅epoll(7)。

     

EPERM目标文件fd不支持epoll

如您所见,ENOMEMENOSPC是运行时错误。根据您的逻辑,EPERM也可能是运行时错误(例如,如果您将stdin合并到epoll并且存在重定向)。

然而,良好的做法建议你检查 - 如果你有逻辑错误,最好早点失败。