栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在fd_set上使用结构复制(对于select()或pselect())会导致问题的平台吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在fd_set上使用结构复制(对于select()或pselect())会导致问题的平台吗?

由于

structfd_set
这只是一个常规的C结构,因此应该总是可以的。我个人不喜欢通过
=
运算符进行结构复制,因为我在许多无法访问正常的编译器内在函数的平台上工作。
memcpy()
在我的书中,显式使用而不是让编译器插入函数调用是一种更好的方法。

在C规范中,第 6.5.16.1 节“ 简单赋值” (为简便起见,在此处进行了编辑):

以下条件之一应成立:

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

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

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

因此,只要您

struct fd_set
实际上是一个常规C
struct
,您就可以保证成功。但是,它的确取决于编译器发出某种代码来执行此操作,或者取决于
memcpy()
它用于结构分配的任何内在函数。如果您的平台由于某种原因无法链接到编译器的内部库,则可能无法正常工作。

如果您打开的文件描述符数量多于文件描述符的数量,则您将需要技巧

struct fd_set
。linux
手册页说:

An

fd_set
是固定大小的缓冲区。执行
FD_CLR()
FD_SET()
具有值
fd
为负或等于或大于
FD_SETSIZE
将导致未定义的行为。此外,POSIX必须
fd
是有效的文件描述符。

如下所述,证明您的代码在所有系统上都是安全的可能并不值得。

FD_COPY()
提供此类用途,并且可以保证始终保证:

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373772.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号