最近在项目中遇到一个 EPOLLHUP的问题:
场景类似这样:一个后台进程通过FIFO接收前台的事件,并根据接收到的事件类型作具体处理;前台进程(多个)通过FIFO 传输一个int 数据通知后台进程需要处理的事件。
在后台打开FIFO的读端,并通过epoll 对FIFO 的读事件 和多个socket 读写事件 检测。当FIFO可读时,读入一个int 数据,并根据值 调用对应的处理方法。
当所有的客户端都关闭,此时已经没有进程 持有FIFO的写端,此时epoll 会收到一个FIFO的EPOLLHUP事件。
因为没有对FIFO的EPOLLHUP事件 进行处理,所以在接下来的时间,epoll 会一直持续不断的收到FIFO的EPOLLHUP事件。
解决办法:
经过查询UNP v2得知,epoll 收到FIFO的EPOLLHUP事件 是因为所有的客户端都关闭的FIFO的写端。
并且UNP v2 给出了一个巧妙的解决办法,
那就是在后台进程中 也打开一个FIFO的写端,并左右一个哑(dummy)句柄 弃之不用。