[英]How can I use select() to monitor an object?
从这里开始 ,它说select()
用于“监视多个文件描述符,等到一个或多个文件描述符对于某种I / O操作(例如,可能输入)变为“就绪”状态”。 然后,我看了Beej的套接字编程指南 ,他们使用select()
监视套接字文件描述符。
简而言之,教程和手册页说select()
对文件描述符运行。 但是,我遇到了一段使用select()
监视对象的代码 。 码:
class SomeObject
{
public:
static SomeObject *_pInstance;
//...some other methods...
}
SomeObject *SomeObject::_pInstance = new SomeObject();
SomeObject &refObj = *SomeObject::_pInstance;
fd_set fdAllSet, fdReadableSet;
int nReadyHandles = 0;
FD_SET( refObj, &fdAllsSet ); //<---this line
while (1)
{
fdReadableSet = fdAllSet;
nReadyHandles = select( maxFd+1, &fdReadableSet, NULL, NULL, &someWaitTime );
while (nReadyHandles > 0)
{
if (FD_ISSET(refObj, &fdReadableSet))
{//do something
FD_CLR(refObj, &fdReadableSet);
}
}
}
所以问题是, select()
如何确定我的“对象已准备就绪”? 又为什么FD_SET()
没有给出任何编译错误,因为第一个参数假定是int
而不是refObj
?
FD_SET和朋友们以整数作为第一个参数...
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
因此,您的代码唯一可以编译的方法是(a)SomeObject具有用户定义的SomeObject::operator int()
转换操作符,该操作符返回文件描述符:
class SomeObject
{
int my_fd;
operator int() { return my_fd; }
};
或(b)FD_ *操作被定义为实函数(而不是宏),并且用户定义的FD_ *重载将SomeObject提取/映射到fd,然后调用原始系统版本:
void FD_CLR(const SomeObject& so, fd_set *set)
{
FD_CLR(so.my_fd, set);
}
int FD_ISSET(const SomeObject& so, fd_set *set)
{
return FD_ISSET(so.my_fd, set);
}
void FD_SET(const SomeObject& so, fd_set *set)
{
return FD_SET(so.my_fd, set);
}
猜测,类SomeObject
有一个重载,可以转换为整数,无论执行什么操作,它都会返回文件描述符。
select()和FD_SET用于文件描述符,它们实际上是整数,而不是指向“ SomeObject”的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.