unix select() 调用:如何组合 fd_sets?

2024-04-18

我正在用 C 语言为 Linux 编写一个应用程序,它使用 2 个独立的第三方库。这两个库都是异步的并使用 select()。他们还提供了一个 API,可以返回他们等待的文件描述符。我的目的是将它们传递给我自己的 select() ,然后在设置了自己的 fd 值时将控制返回给任何库。

我想我已经写完了大部分内容,但是在涉及 select() 参数的地方遇到了麻烦:两个库都不提供单独的文件描述符,而是提供指向它们的读写 fd_sets 的指针。我需要将从这些库返回的 fd_set 组合成一个用于读取的 fd_set,一个用于写入的 fd_set,等等。

关于如何将 2 个 fd_set 合并为一个结果 fd_set 有什么建议吗?

Addendum对不起!我应该更清楚..这些库只返回 fd_sets...我不知道每个集合中的 FD 数量,以便我可以执行 for 循环并单独设置每个 FD..是否有一种简单的方法来确定这只是一个 fd_set 吗?


不依赖于实现的 C 代码fd_set:

void Fdset_Add(fd_set *Out, fd_set const *In, int InNfds)
{
    for(i = 0; i < InNfds; i++)
    {
        if(i < InNfds && FD_ISSET(i, In))
            FD_SET(i, Out);
    }
}

int Fdset_Merge(fd_set *Out, fd_set const *In1, int NFds1, fd_set const *In2, int NFds2)
{
    FD_ZERO(Out);
    Fdset_Add(Out, In1, Nfds1);
    Fdset_Add(Out, In2, Nfds2);
    return Nfds1 > Nfds2 ? Nfds1 : Nfds2;
}

int Fdset_Filter(fd_set const *Result, int ResultNfds, fd_set *ToFilter, int NfdsToFilter)
{
    int i;
    int Retval;

    Retval = 0;
    for(i = 0; i < ResultNfds; i++)
    {
        if(i < NfdsToFilter && FD_ISSET(i, ToFilter))
        {
            if(! FD_ISSET(i, Result))
                FD_CLR(i, ToFilter);
            else
                Retval++;
        }
    }
    return Retval;
}

void Fdset_Split(fd_set const *Result, int ResultNfds, fd_set *In1, int Nfds1, int *Count1, fd_set *In2, int Nfds2, int *Count2)
{
     *Count1 = Fdset_Filter(Result, ResultNfds, In1, Nfds1);
     *Count2 = Fdset_Filter(Result, ResultNfds, In1, Nfds2);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unix select() 调用:如何组合 fd_sets? 的相关文章

随机推荐

  • 在 Jupyter Notebook for Anaconda3 中导入自定义 .py 文件

    我在 Mac 上的哪里存储 Anaconda3 的自定义 py 文件 以便我可以将它们作为包导入到 Jupyter Notebook 中 如果插入 您可以将它们存储在任何地方 import os import sys sys path ap
  • 微软机器人框架上的对话机器人可能吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否有可能使用微软的机器人框架建立一个对话机器人 我目前正在使用 Luis 和 Qna Maker 的组合 但它仍然是一个单一的问答机
  • 扩展C++字符串成员函数

    我需要进行不区分大小写的查找 并发现以下代码可以解决问题 bool ci equal char ch1 char ch2 return toupper unsigned char ch1 toupper unsigned char ch2
  • AngularJS 和休息服务

    我最近开始尝试AngularJS 我正在构建一个简单的 html5 应用程序来更新MySQL数据库 索引 html
  • 获取 LinkedIn 分享计数 JSONP

    使用 LinkedIn API 我想获取 URL 的分享计数 https www linkedin com countserv count share url http www linkedin com format json 但这给了我一
  • 从Java调用Android WebView中的jQuery函数?

    我正在尝试调用在 html 中定义的 javascript 函数 喜欢 WebView loadUrl javascript hoge 我可以调用非 jQuery 函数 但无法调用我在 document ready function jQu
  • IllegalStateException:getAttribute:会话已失效

    我的第一个 JSF IceFaces 版本 1 8 2 应用程序在 JBoss 5 1 0 上运行时遇到问题 一段时间后我收到一个异常 告诉我有关会话问题 这很奇怪 因为我根本不在我的代码中使用会话 以下日志显示由于此错误 来自 JBoss
  • 指向动态分配的 boost multi_array 中的类的指针,未编译

    我对 C 和 Boost 还很陌生 我想要 world 类的对象有一个名为 chunk 类型为 octreenode 的数组 以前我有一个普通的一维数组 这工作得很好 现在我尝试转向使用具有 Boost 的 multi array 功能的
  • 使用 PHP 从多选下拉列表中获取数据并插入到 MySQL 中

    我的数据库中有一个使用以下命令创建的日期列表SET数据类型 SET Mon Tue Wed Thr Fri Sat Sun 我希望用户能够使用多选下拉列表选择多天放入数据库
  • 如何在 WPF 中按名称查找样式触发器嵌入元素?

    首先 问题的核心 如果通过样式触发器将一个元素指定为 ContentControl 的内容 我似乎无法按名称找到它 现在 了解更多详细信息 我有一个面板 其布局和功能根据其数据上下文而有很大差异 这是来自错误库的错误 当该错误为空时 它是一
  • 根据合并请求触发 gitlab-ci 中的作业

    是否可以仅根据合并请求从 gitlab ci 运行作业 现在 我们有一个包含大量测试的大型整体项目 但我们只想在合并到分支 master 之前运行测试 嗯 目前还没有内置 但是您自己也不是不可能 Gitlab 允许trigger https
  • 支持 __getitem__ 的类的 Python 类型提示

    我想向一个函数添加类型提示 该函数将接受带有 getitem 方法 例如 在 def my function hasitems locator hasitems locator 我不想限制hasitems成为特定类型 例如list or d
  • 如何将查询字符串传递给backbone.js 路由

    我正在使用 Backbone js 和 jQuery mobile jQuery 移动路由被禁用 我仅将库用于 UI 除了选择页面转换之外 我一切正常 我需要将页面转换 向上切片 淡入淡出 向下滑动 传递到主干路由器 因为转换根据用户来自的
  • 获取数据工厂中单个管道执行的成本

    我正在考虑使用 Azure 数据工厂 V2 进行集成导入 并想知道是否有办法跟踪正在运行的各个管道的成本 例如 如果我有 3 个管道 代表 3 个不同的集成 是否有办法查看每个管道产生的成本 还有一种方法可以近乎实时地执行此操作 以便在一个
  • 我们应该使用 setTargetFragment() 吗?我认为 Fragments 不应该互相通信

    Android开发者教程建议我使用片段的宿主活动来传递数据等等 那么为什么有一个设置 获取目标片段方法呢 到目前为止 我的应用程序包含一个主机活动和一个片段 其中有一个启动按钮DialogFragment 其中有一个按钮可以启动另一个Dia
  • Pandas 会影响 Rapidfuzz 匹配的结果吗?

    我正在碰壁 如果我在 pandas 数据帧内运行 Rapidfuzz 以及单独运行它 它会为字符串分数相似性提供不同的结果吗 为什么地址相似度 2 和最后一行的结果不同 from rapidfuzz import process utils
  • 在 Android 中使用带有自定义标签的块模板引擎

    我正在尝试在 android 中使用 chunk 我需要这样的东西 Suppose 以下是标签 tags 世界 世界 c 丹尼斯 里奇 苹果 工作 Input HELLO world C 是由 c 而java是由 java 编写的 hola
  • 在 R 中安装插入符包时出现依赖问题

    我正在尝试安装 R 包caret 这给了我ERROR dependencies ggplot2 reshape2 BradleyTerry2 are not available for package caret 我尝试单独安装其中的每一个
  • 如何在SCSS中获取数组的$values?

    我正在制作自己的插件 通过编写单个插件自动进行多个媒体查询 includeSCSS 中的行 所以当我输入时 include medias bp values width 输出应该是这样的 media all and min width 56
  • unix select() 调用:如何组合 fd_sets?

    我正在用 C 语言为 Linux 编写一个应用程序 它使用 2 个独立的第三方库 这两个库都是异步的并使用 select 他们还提供了一个 API 可以返回他们等待的文件描述符 我的目的是将它们传递给我自己的 select 然后在设置了自己