由于
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。



