首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法将文件描述符与用户定义的数据关联起来?

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

Stack Overflow用户
提问于 2011-11-18 07:15:39
回答 4查看 2.2K关注 0票数 5

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-18 07:28:12

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

您一次要处理多少个客户?除非是数百或更多,否则与执行任何类型的I/O相比,查找的成本将微不足道。

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

代码语言:javascript
复制
#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)
    }
}
票数 4
EN

Stack Overflow用户

发布于 2011-11-18 07:21:12

最便宜的方法是创建一个固定大小的连接结构数组,每个条目包含{,*context,...,可能还有回调函数},由fd (=O(1))对状态进行索引。内存很便宜,您可以负担几百或数千个文件描述符和表项。

编辑:你不需要使它固定大小。如果您的pollstructure或fdset是固定的:使其固定;否则使用getdtablesize()或getrlimit()来获取要分配的条目数量。

票数 2
EN

Stack Overflow用户

发布于 2011-11-18 08:58:39

如果你使用poll()select()/pselect(),那么你应该自己保存数据,例如,像其他人提到的那样保存在哈希表或数组中。这是最便携的解决方案。有些替代界面确实有方法来关联您自己的用户数据。例如,使用asynchronous I/O (例如aio_read()),您可以提供一个用户值sigev_value,该值可以在异步请求完成时传递给信号处理程序或线程。Linux epoll接口还允许为集合中的每个文件描述符指定用户数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8175746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档