[英]networking with epoll: error handling
我正在使用Linux epoll工具开发用C编写的网络应用程序。 我确实在实现自己的事件循环,是的,我知道有一些库可以为我做这件事。 但是,这只是一个练习,我想自己实现事件循环。
我想知道如何处理错误处理,特别是处理epoll系统调用返回的错误。 我应该检查每个返回值吗? 因为,在我看来,例如epoll_ctl
返回的某些错误是逻辑错误,而不是运行时错误 ; 我的意思是,我唯一看到epoll_ctl
失败的原因是我不小心将其喂给了非法的epoll文件描述符或仅在您编写不正确的代码时才会发生的其他事情。 所以我的问题是, epoll_ctl
是否可以 实际返回“运行时错误”,例如 在管道断开时执行 write
操作? 如果是这样,我应该检查一下吗? 我无意检查表明内核已耗尽资源或类似资源的错误(在那种情况下,甚至可以做什么?)。 附加问题:当fcntl
仅用于设置一些标志( O_NONBLOCK
)时,会产生某种类型的运行时错误吗?
是的, epoll
可以返回运行时错误。
从联机帮助页:
错误
EBADF
epfd
或fd
不是有效的文件描述符。
EEXIST
op是EPOLL_CTL_ADD
,并且提供的文件描述符fd
已经在此epoll实例中注册。
EINVAL
epfd不是epoll文件描述符,或者fd
与epfd
相同,或者此接口不支持请求的操作op。
ENOENT
op是EPOLL_CTL_MOD
或EPOLL_CTL_DEL
,并且fd
未在该epoll
实例中注册。
ENOMEM
没有足够的内存来处理请求的操作控制操作。
ENOSPC
尝试在epoll实例上注册(EPOLL_CTL_ADD
)新文件描述符时遇到了/proc/sys/fs/epoll/max_user_watches
施加的限制。 有关更多详细信息,请参见epoll
(7)。
EPERM
目标文件fd
不支持epoll
。
如您所见, ENOMEM
和ENOSPC
是运行时错误。 根据您的逻辑, EPERM
也可能是运行时错误(例如,如果您将stdin合并到epoll
并且存在重定向)。
但是,优良作法建议您还是进行检查-如果遇到逻辑错误,最好尽早失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.