我正在使用Linux epoll工具开发一个用C语言编写的网络应用程序。 我确实正在实现我自己的事件循环,是的,我知道有些库可以帮我这样做。然而,这只是一个练习,而且我想要自己实现事件循环。
我想知道如何处理错误处理,特别是处理epoll系统调用返回的错误。我应该真的检查每个返回值吗?因为,在我看来,e返回的一些错误。 G。 epoll_ctl
是逻辑错误而不是运行时错误;我的意思是,我唯一一次看到epoll_ctl
失败的时候是我不小心给它一个非法的epoll文件描述符或其他只在你编写错误代码时才出现的东西。 所以我的问题是, epoll_ctl
实际上会返回“运行时错误”,比如说, write
管道坏了会怎么办?如果是的话,我应该检查一下吗?我不打算检查指示内核资源耗尽或类似内容的错误(在这种情况下,甚至可以做什么?)。其他问题:当fcntl
仅用于设置某些标志(O_NONBLOCK
)时,{{1}}会产生某种运行时错误吗?
答案 0 :(得分:2)
是的,epoll
可以返回运行时错误。
从联系手册:
错误
EBADF
epfd
或fd
不是有效的文件描述符。
EEXIST
op为EPOLL_CTL_ADD
,提供的文件描述符fd
已在此epoll实例中注册。
EINVAL
epfd不是epoll文件描述符,或者fd
与epfd
相同,或者此接口不支持请求的操作op。
ENOENT
操作为EPOLL_CTL_MOD
或EPOLL_CTL_DEL
,fd
未在此epoll
实例中注册。
ENOMEM
没有足够的内存来处理请求的操作控制操作。
ENOSPC
尝试在epoll实例上注册(/proc/sys/fs/epoll/max_user_watches
)新文件描述符时遇到EPOLL_CTL_ADD
强加的限制。有关详细信息,请参阅epoll
(7)。
EPERM
目标文件fd
不支持epoll
。
如您所见,ENOMEM
和ENOSPC
是运行时错误。根据您的逻辑,EPERM
也可能是运行时错误(例如,如果您将stdin合并到epoll
并且存在重定向)。
然而,良好的做法建议你检查 - 如果你有逻辑错误,最好早点失败。