繁体   English   中英

如何使用select()监视对象?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM