簡體   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