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