如何使用 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"的指针。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 通过指针在 gdb/Eclipse CDT 调试监视中显示真实的对象层次结构
- 如何使用 select() 来监视对象
- 使用提升线程监视对象队列