由于structfd_set
这只是一个常规的C结构,因此应该总是可以的。我个人不喜欢通过=
运算符进行结构复制,因为我在许多无法访问正常的编译器内在函数的平台上工作。memcpy()
在我的书中,显式使用而不是让编译器插入函数调用是一种更好的方法。
在C规范中,第 节“ (为简便起见,在此处进行了编辑):
以下条件之一应成立:
…
…
在 简单赋值 (=)中,将右操作数的值转换为赋值表达式的类型,并替换存储在由左操作数指定的对象中的值。
如果从另一个对象中读取存储在一个对象中的值,而该对象与第一个对象的存储有任何重叠,则该重叠应准确无误,并且两个对象应具有兼容类型的合格或不合格版本;否则,行为是不确定的。
因此,只要您struct fd_set
实际上是一个常规Cstruct
,您就可以保证成功。但是,它的确取决于编译器发出某种代码来执行此操作,或者取决于memcpy()
它用于结构分配的任何内在函数。如果您的平台由于某种原因无法链接到编译器的内部库,则可能无法正常工作。
如果您打开的文件描述符数量多于文件描述符的数量,则您将需要技巧struct fd_set
。linux手册页说:
Anfd_set
是固定大小的缓冲区。执行FD_CLR()
或FD_SET()
具有值fd
为负或等于或大于FD_SETSIZE
将导致未定义的行为。此外,POSIX必须fd
是有效的文件描述符。
如下所述,证明您的代码在所有系统上都是安全的可能并不值得。 FD_copy()
提供此类用途,并且可以保证始终保证:
FD_COPY(&fdset_orig, &fdset_copy)
用的&fdset_copy
副本替换已分配的文件描述符集&fdset_orig
。