如何阻止epoll_wait?
How to stop epoll_wait?
我刚开始在 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;
}
相关文章:
- std::condition_variable::wait()如何评估给定的谓词
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- std::memory_order for std::atomic:<T>:wait
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 我应该如何使用 epoll 从同一个 FD 读取和写入
- std::future::get()或std::future::wait()是std::thread::join()的替
- 使用 epoll 边缘触发器的套接字上的数据过多
- Epoll zero recv() and negative(EAGAIN) send()
- 在 while 循环中使用 std::condition_variable::wait 是否正确
- 如何使用 epoll(void* event.data.ptr) 管理 Connection 的生命周期
- future::wait() 是否与 async() 执行线程的完成同步?
- 为什么'wait with predicate'求解条件变量的'lost wakeup'?
- 线程锁定互斥锁的速度比 std::conditional_variable::wait() 快
- deadline_timer::wait 是否让位于其他任务
- std::future::wait 是内存障碍吗?(我无法解释这种数据竞赛)
- 我可以将一个套接字添加到多个 epoll 实例吗?
- 如何退出 QThread::wait()
- 如何修复OSX中的"fatal error: 'sys/epoll.h' file not found"?