从这里开始,它说它select()
用于“监视多个文件描述符,等待一个或多个文件描述符为某种类型的 I/O 操作(例如,可能的输入)“准备好”。然后我看了一下Beej的socket编程指南,他们用来select()
监控socket文件描述符。
简而言之,教程和手册页说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()
不给出任何编译错误,因为第一个参数假设是 anint
而不是refObj
?