epoll在使用中socket没有正确关闭

    在实际工作中,遇到过一个关于epoll使用的问题,总结来说,就是epoll使用不当,导致epoll关联了错误的文件描述符,进程始终收到内核的事件通知,然后在对应的错误的文件描述符上收取报文,错误的报文导致不能进入正确的报文处理流程,然后由于文件描述符错误,又无法正确关闭epoll,最终进入死循环,导致系统无法正确处其它消息,系统异常的问题。

    该问题的确认方法很简单,所有使用了epoll机制的进程,在其/proc/PID/fd下都能看到一个或多个anon_inode:[eventpoll]的文件描述符。然后通过“cat /proc/PID/fdinfo/对应的fd值” 就可以看到详细的epoll注册的fd的信息。正常情况下,注册到epoll的文件描述符的event字段是是注册时使用参数的值,data字段对应的是被注册的文件描述符的值,如果这些值和文件描述注册时使用的参数,以及文件描述符本身值不一致,那一定是被篡改了,最终会导致问题。

    该问题出现的原因是,代码中在使用epoll_ctl函数的EPOLL_CTL_MOD功能时,使用的第三个参数E是一个全局变量,如果是全局变量的话,就很可能在使用时在别的地方被修改了,然后MOD到内核中,就会变成一个前后不一致的异常值,导致该问题。

 

        ----  仅针对工作中遇到的问题是这个原因,也有可能有别的原因导致相同的现象,可用该分析作为排查对象之一。

你可能感兴趣的:(linux)