我正在以这种方式将套接字添加到kqueue列表(Id = kqueue()):
struct kevent changes[1];
int16 filter = 0;
filter = filter | EVFILT_READ | EVFILT_USER;
EV_SET(&changes[0], socket.GetNativeHandle() /* a valid socket fd */, filter, EV_ADD | EV_CLEAR | EV_ENABLE, 0, 0, NULL);
int result = kevent(Id, changes, 1, NULL, 0, NULL);
if (result == -1)
{
return false;
}
Events.Emplace();
,然后在循环中的某处:
const int count = kevent(Id, NULL, 0, &Events[0], Events.GetSize(), NULL);
if (count == -1)
{
return false;
}
一切正常,但是当我直接使用close()
关闭套接字fd时,Kqueue不执行任何操作,但仍阻塞了该线程。但是,当我直接在Kqueue fd上使用close()
时,它可以工作,但这对我来说并不正确。有什么事吗缺少事件标志?