有没有办法将文件描述符与用户定义的数据相关联?

amn*_*amn 5 c sockets posix

我正在编写一个客户端 - 服务器应用程序,它使用POSIX poll函数来提供一种并发客户端处理的形式.客户端还具有状态和其他相关数据,这些数据存储在客户端结构中.

我当前的问题是,当我从poll与客户端(概念上)相关联的套接字文件描述符上获取I/O 提示时,我必须将文件描述符实际匹配到其关联的客户端数据结构.目前我进行O(n_clients)查找(我的客户端数据结构存储描述符),但我想知道是否存在更好的替代方案?

Ada*_*eld 4

不。如果有,它必须由内核跟踪,因此查找该数据将涉及系统调用。系统调用的成本比在用户空间中执行 O(n) 查找要昂贵一个数量级。

您同时与多少个客户打交道?除非数量级为数百或更多,否则与执行任何类型 I/O 的成本相比,查找成本将微乎其微。

您也可以只使用由文件描述符索引的数组,而不是使用 O(n) 查找,假设您一次打开的描述符不会超过一定数量。例如:

#define MY_MAX_FD 1024  // Tune this to your needs
void *per_fd_data[MY_MAX_FD];

void *get_per_fd_data(int fd)
{
    assert(fd >= 0);
    if(fd < MY_MAX_FD)
        return per_fd_data[fd];
    else
    {
        // Look up fd in a dynamic associative array (left as an exercise to the
        // reader)
    }
}
Run Code Online (Sandbox Code Playgroud)