繁体   English   中英

与epoll联网:错误处理

[英]networking with epoll: error handling

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

我想知道如何处理错误处理,特别是处理epoll系统调用返回的错误。 我应该检查每个返回值吗? 因为,在我看来,例如epoll_ctl返回的某些错误是逻辑错误,而不是运行时错误 我的意思是,我唯一看到epoll_ctl失败的原因是我不小心将其喂给了非法的epoll文件描述符或仅在您编写不正确的代码时才会发生的其他事情。 所以我的问题是, epoll_ctl 是否可以 实际返回“运行时错误”,例如 在管道断开时执行 write 操作? 如果是这样,我应该检查一下吗? 我无意检查表明内核已耗尽资源或类似资源的错误(在那种情况下,甚至可以做什么?)。 附加问题:当fcntl仅用于设置一些标志( O_NONBLOCK )时,会产生某种类型的运行时错误吗?

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

从联机帮助页:

错误

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

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

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

ENOENT op是EPOLL_CTL_MODEPOLL_CTL_DEL ,并且fd未在该epoll实例中注册。

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

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

EPERM目标文件fd不支持epoll

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

但是,优良作法建议您还是进行检查-如果遇到逻辑错误,最好尽早失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM