如何阻止epoll_wait?

How to stop epoll_wait?

本文关键字:wait epoll 何阻止      更新时间:2023-10-16

我刚开始在 Linux 中编码,需要使用epoll将我的 Win 服务器代码移植到这里。 我不知道如何阻止epoll_wait.

epoll 循环在单独的线程中运行,main 函数处理控制台命令。输入"退出"命令后,我需要停止服务器。简单地关闭主插座不起作用。那么在这种情况下如何正确停止 epoll(可能会导致以某种方式epoll_wait在所有线程中返回错误(?

通常,您将一个特殊的文件描述符放在文件描述符epoll列表中。eventfd或管道是很好的候选者。每当需要中断epoll_wait时,您都会发出该文件描述符的信号,并在事件处理循环中检查该文件描述符作为循环退出条件。

或者,您可以从另一个线程关闭 epoll fd 并触发一个您可以忽略的 SIGINT,然后在重新启动epoll_wait时,由于 efd 不再有效,它将返回 -1 并将 errno 设置为 EINVAL,以便您可以退出 epoll 线程。

int efd;
pthread_t ethread;

void terminate_epoll( void )
{
close( efd );
pthread_kill( ethread, SIGINT );
pthread_join( ethread, NULL );
}

void* epoll_thread( void* data )
{
for(;;)
{
n = epoll_wait( efd, events, EPOLL_EVENT_COUNT, -1 );
if( n == -1 )
{
if( errno == EINTR )
continue;
if( errno == EINVAL )
goto end;
...

}
}
end:
return NULL;
}