是否有任何平台在 fd_set(对于 select() 或 pselect())上使用结构复制会导致问题?

2024-04-11

The select() and pselect() http://www.opengroup.org/onlinepubs/9699919799/functions/pselect.html系统调用修改它们的参数('fd_set *' 参数),因此输入值告诉系统要检查哪些文件描述符,返回值告诉程序员哪些文件描述符当前可用。

如果您要针对同一组文件描述符重复调用它们,则需要确保每次调用都有描述符的最新副本。最明显的方法是使用结构副本:

fd_set ref_set_rd;
fd_set ref_set_wr;
fd_set ref_set_er;
...
...code to set the reference fd_set_xx values...
...
while (!done)
{
    fd_set act_set_rd = ref_set_rd;
    fd_set act_set_wr = ref_set_wr;
    fd_set act_set_er = ref_set_er;
    int bits_set = select(max_fd, &act_set_rd, &act_set_wr,
                          &act_set_er, &timeout);
    if (bits_set > 0)
    {
        ...process the output values of act_set_xx...
    }
 }

(编辑删除不正确的struct fd_set参考文献 - 正如“R..”所指出的。)

我的问题:

  • 是否有任何平台无法安全地进行结构复制fd_set值如图所示?

我担心会有隐藏的内存分配或任何意外的事情。 (有宏/函数 FD_SET()、FD_CLR()、FD_ZERO() 和 FD_ISSET() 可以从应用程序中屏蔽内部结构。)

我可以看到 MacOS X (Darwin) 是安全的;因此,其他基于 BSD 的系统可能是安全的。您可以通过在答案中记录您知道安全的其他系统来提供帮助。

(我确实有点担心fd_set可以处理超过 8192 个打开的文件描述符 - 默认打开文件的最大数量仅为 256,但最大数量是“无限制”的。此外,由于结构为 1 KB,因此复制代码的效率并不高,但随后运行文件描述符列表以在每个周期重新创建输入掩码也不一定高效。也许你做不到select()当您打开那么多文件描述符时,尽管那是您最有可能需要该功能的时候。)


有一个相关的问题 - 询问'poll() 与 select()' https://stackoverflow.com/questions/970979/what-are-the-differences-between-poll-and-select它解决了与此问题不同的一组问题。


请注意,在 MacOS X 上——大概还有更普遍的 BSD 上——有一个FD_COPY()宏或函数,具有有效原型:

  • extern void FD_COPY(const restrict fd_set *from, restrict fd_set *to);.

在尚不可用的平台上可能值得效仿。


Since struct fd_set只是一个常规的 C 结构,应该总是没问题的。我个人不喜欢通过=运算符,因为我在许多无法访问正常的编译器内在函数集的平台上工作过。使用memcpy()在我的书中,显式地而不是让编译器插入函数调用是更好的方法。

来自 C 规范,部分6.5.16.1 简单赋值(为简洁起见,在此编辑):

应满足下列条件之一:

...

  • 左操作数具有与右操作数兼容的结构或联合类型的限定或非限定版本;

...

In 简单的作业(=),右操作数的值被转换为赋值表达式的类型,并替换左操作数指定的对象中存储的值。

如果存储在一个对象中的值是从与第一个对象的存储以任何方式重叠的另一个对象读取的,则重叠应是精确的,并且两个对象应具有兼容类型的合格或不合格版本;否则,行为是未定义的。

所以就这样吧,只要struct fd_set实际上是一个普通的Cstruct,你一定会成功。但是,它确实取决于您的编译器发出某种代码来执行此操作,或者依赖于任何其他内容memcpy()它用于结构分配的内在函数。如果您的平台由于某种原因无法链接到编译器的内部库,则它可能无法工作。

如果打开的文件描述符多于适合的数量,则必须使用一些技巧struct fd_set。 linuxman page http://linux.die.net/man/3/fd_set says:

An fd_set是一个固定大小的缓冲区。执行中FD_CLR() or FD_SET()值为fd为负数或等于或大于FD_SETSIZE将导致未定义的行为。此外,POSIX 要求fd是一个有效的文件描述符。

如下所述,可能不值得付出努力来证明您的代码在所有系统上都是安全的。FD_COPY()正是为了这样的用途而提供的,并且大概总是保证:

FD_COPY(&fdset_orig, &fdset_copy)替换已经分配的&fdset_copy文件描述符集的副本&fdset_orig.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有任何平台在 fd_set(对于 select() 或 pselect())上使用结构复制会导致问题? 的相关文章

  • 通过名称查找进程ID

    如何在 Ruby 中通过名称或完整命令行找到 pid 而不调用外部可执行文件 我正在将 SIGUSR2 发送到命令行包含的进程ruby job rb 我想在不打电话的情况下执行以下操作pgrep uid Process uid pid pg
  • 将指针转换为浮点数?

    我有一个unsigned char 通常 这指向一块数据 但在某些情况下 指针就是数据 即 铸造一个int的价值unsigned char 指针 unsigned char intData unsigned char myInteger 反
  • 隐式方法组转换陷阱

    我想知道为什么给定代码的输出 在 LinqPad 中执行 void Main Compare1 Action Main Dump Compare2 Main Dump bool Compare1 Delegate x return x Ac
  • 如何“杀死”Pthread?

    我正在学习 Pthreads 并且想知道杀死这样一个对象的最佳方法是什么 在寻找类似的问题后 我无法找到 明确 的答案 但请随时向我指出任何相关问题 我正在使用一个小型客户端服务器应用程序 其中服务器主线程正在侦听套接字上的客户端连接 每次
  • 基于 MS Bot Framework 中的响应分支对话框/表单

    我们正在尝试使用 MS Bot Framework 但尚未完全弄清楚如何实现此场景 我们有一个 LUIS 对话框 类型 它工作正常并且经过适当的培训 以常见的三明治为例 LUIS 意图寻找的基本内容是用户询问订单状态 如果问题中提供了订单号
  • 将列表(对象)转换为列表(字符串)

    有没有办法转换List of Object to a List of String 在 c 或 vb net 中而不迭代所有项目 幕后迭代很好 我只想要简洁的代码 Update 最好的方法可能就是进行新的选择 myList Select f
  • 有没有办法使 C90 标准中的枚举无符号? (符合 MISRA-C 2004 标准)

    我正在尝试找到一种使枚举 无符号 的方法 enum x1 0 x2 x3 uint8 t x2 lt PC LINT MISRA C 2004 will complain about mixing signed and unsigned h
  • 在 ncurses 中使用退格键

    我设置了一个简单的 ncurses 程序 它使用 getch 一次读取一个字符并将它们复制到缓冲区中 我遇到的问题是检测到按下退格键 这是相关代码 while buffer i c getch EOF i if c n break else
  • 如何用C++解析复杂的字符串?

    我试图弄清楚如何使用 解析这个字符串sstream 和C 其格式为 string int int 我需要能够将包含 IP 地址的字符串的第一部分分配给 std string 以下是该字符串的示例 std string 127 0 0 1 1
  • Scrapy FakeUserAgentError:获取浏览器时发生错误

    我使用 Scrapy FakeUserAgent 并在我的 Linux 服务器上不断收到此错误 Traceback most recent call last File usr local lib64 python2 7 site pack
  • 如何调用位于其他目录的Makefile?

    我正在尝试这样做 我想打电话给 make Makefile存在于其他目录中 abc可以使用位于不同目录中的 shell 脚本的路径 我该怎么做呢 由于 shell 脚本不允许我cd进入Makefile目录并执行make 我怎样才能编写she
  • 为什么 std::ranges::filter_view 对象必须是非常量才能查询其元素?

    include
  • 如何使用简历实现一个“一网打尽”的异常处理程序?

    我想知道我怎样才能写一个抓住他们全部应用程序级别的异常处理程序将为用户提供恢复应用程序流程的选项 如果您正在运行 Windows 窗体应用程序 将处理程序添加到Application ThreadException event
  • 实体框架代理创建

    我们可以通过使用来停止在上下文构造函数中创建代理 this Configuration ProxyCreationEnabled false 在 EF 4 1 中创建代理有哪些优点和缺点 代理对于两个功能是必需的 延迟加载 导航属性在第一次
  • 将小数格式化为两位或整数

    对于 10 我想要 10 而不是 10 00 对于 10 11 我想要 10 11 没有代码可以实现吗 即通过指定格式字符串类似于 0 N2 decimal num 10 11M Console WriteLine num ToString
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN
  • 类unix系统中的python和python3命令有什么区别?

    我通读了每个命令的描述 但每个命令的描述都是完全相同的 所以我不明白这两个命令在类 Unix 系统中的工作方式有何不同 谁能解释其中的区别吗 Python3命令的引入是因为python命令指向了python2 从那时起 Python3 已成
  • 具有多种类型的 C# 泛型类型推断

    我有以下通用方法 用于将一种类型的输入对象序列化为超类型 如下所示 public string SerialiseAs
  • 如何向 ItemsControl 中的 WPF 按钮添加相同的命令

    如何将命令添加到 wpf 按钮 该按钮是ItemsControl并正在修改ItemsSource itself 这是我的 XAML
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b

随机推荐

  • Python 多处理和处理工人中的异常

    我使用 python 多处理库来实现一种算法 其中有许多工作人员处理某些数据并将结果返回给父进程 我使用 multiprocessing Queue 将作业传递给工作人员 然后收集结果 一切都运行得很好 直到工作人员无法处理某些数据块 在下
  • Opencv Python打开dng格式

    我不知道如何在 opencv 中打开 dng 文件 该文件是在使用三星 Galaxy S7 的专业选项时创建的 使用这些选项时创建的图像是 dng 文件以及尺寸为 3024 x 4032 的 jpg 我相信这也是 dng 文件的尺寸 我尝试
  • MVC3 和 EF 数据优先:最佳实践是什么?

    似乎 MVC3 和 EF4 1 的大部分焦点都围绕 代码优先 我似乎找不到任何满足以下条件的示例或教程 使用现有的 SQLServer 数据库 有单独的网络和数据访问项目 我们将有多个网络应用程序共享相同的数据访问类 验证建议 是否存在这样
  • javascript中的地理空间查询[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 javascript 库 它可以让我进行地理空间查询 我知道 OpenLayers 和
  • codeigniter、result() 与 result_array()

    我都用result and result array 通常我喜欢将结果作为数组 这就是我主要使用 result array 的原因 但我想知道我应该遵循哪种更好的方法 就性能而言 其中哪一个使用起来更有效 这是我在 codeigniter
  • 如何使用VBA保存分号分隔的csv文件?

    我将数据复制到电子表格中 使用 VBA 对其进行格式化 然后将该工作表保存到 CSV 文件中 我使用以下代码 ws SaveAs Filename filestr Fileformat xlCSV ws 是我保存的工作表 这给了我一个以逗号
  • 在 Symfony2 中将多对多关系保存到数据库

    在我的 Symfony2 项目中 我有两个相关的实体 用户和收藏夹 他们之间是多对多的关系 我的应用程序的工作原理如下 在我的 Twig 页面中 我有一些带有 添加到收藏夹 按钮的项目 当您单击该按钮时 我的控制器会将 item id 保存
  • 无法播放 AVAudioPlayer 中文档中的文件

    我在应用程序的文档文件夹中有一个文件 我想播放它 if NSFileManager defaultManager fileExistsAtPath pathString let url NSURL fileURLWithPath pathS
  • Mac OSX 中的 eclipse 中凭证存储失败

    当我使用 mac 中的 eclipse 和我的凭据连接到 tfs 中的服务器项目时 它的连接没有任何问题 但是当我在登录对话框中检查 保存密码 时 它显示错误 凭据存储失败 无法保存您的凭据 有什么办法可以摆脱这个 因为我不想每次打开 ec
  • LibGDX 文本字段输入导致崩溃

    所以我试图制作一个登录屏幕 现在的问题是 当我在文本字段中输入文本时 我的游戏崩溃了 这是我的主菜单类 import com badlogic gdx Gdx import com badlogic gdx Screen import co
  • 无法对非静态方法进行静态引用

    到目前为止我有以下代码 import java util Scanner public class HallLanceMemoryCalculator private double currentValue public static in
  • window.onload 与 $(document).ready()

    JavaScript 之间有什么区别window onload https developer mozilla org en docs Web API GlobalEventHandlers onload和 jQuery 的 documen
  • Vertx JDBC 的底层工作原理

    我已经使用 Vertx 3 个月了 但现在我想知道非阻塞 Vertx JDBC 是如何工作的 例如 private void selectEndedMatches this jdbcClient getConnection conn gt
  • `fs.js` 中的 `process.binding('fs')` 是什么? [复制]

    这个问题在这里已经有答案了 我看到在顶部fs js有一个process binding fs https github com nodejs node blob master lib fs js L10 https github com n
  • Facebook 创建新应用程序错误 - “不应包含协议信息。”

    我正在尝试更新 创建我的应用程序的 应用程序域 但它不断抛出此错误 Error 应用程序域 http www example com http www example com不应包含协议信息 而我 100 确定我的网站没有任何 OpenGr
  • 如何在 alpine 上安装 aws-cli?

    我正在运行 alpine 的 docker swarm 管理器节点上安装 aws cli Linux 0317632a4ad9 4 9 59 moby 1 SMP Thu Mar 1 20 54 00 UTC 2018 x86 64 Lin
  • 如何制作 HTML 脚本来替换网站的 cookie

    我想要制作一个 HTML 脚本 只需单击一下按钮即可替换特定网站的 cookie PS 我不知道这是如何完成的 我之前创建过扩展 但是我想创建一个执行相同工作的网页 HTML 根本无法对 cookie 执行任何操作 Cookie 可以通过以
  • mySQL 当 field=0 时返回所有行

    我正在做一些测试 当我查询一个表时 令人惊讶的是 查询SELECT FROM table WHERE email 0返回表中的所有行 该表没有 0 值 并且填充了常规电子邮件 为什么会出现这种情况 这可能会导致严重的安全问题 有没有办法在不
  • 在 iOS6 上切换设备上的 FB 帐户时 Facebook 授权失败

    我正在使用 Facebook SDK 3 1 1 在我的 iOS 应用程序中实现 FB Connect 在简单的情况下 无论是使用新的 FB 集成 在 iOS 上登录 还是通过 Web 视图返回到正常授权 在这两种情况下我都没有安装本机 F
  • 是否有任何平台在 fd_set(对于 select() 或 pselect())上使用结构复制会导致问题?

    The select and pselect http www opengroup org onlinepubs 9699919799 functions pselect html系统调用修改它们的参数 fd set 参数 因此输入值告诉系