【发布时间】:2012-04-17 06:38:21
【问题描述】:
来自here,它说select() 用于“监视多个文件描述符,等待一个或多个文件描述符为某种I/O 操作“准备好”(例如,可以输入) ”。然后我查看了Beej's guide for socket programming,他们使用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 宏被重新定义为使用 SomeObject 的 FD 成员!?你从哪里得到这个代码?
-
您需要向我们展示
class SomeObject的完整 声明,以了解其工作原理。为了让它工作,它必须包装一个文件描述符;看看它是如何工作的会很有趣......
标签: c++ linux networking