您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

其他 2022/1/1 18:17:33 有400人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶