gpt4 book ai didi

c++ - 如何使用 select() 来监视对象?

转载 作者:太空狗 更新时间:2023-10-29 11:46:34 24 4
gpt4 key购买 nike

来自 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 和 friend 将整数作为第一个参数...

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);
}

关于c++ - 如何使用 select() 来监视对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10186344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com