从 fds_bits 中提取文件描述符
Extract file descriptors from fds_bits
我正在调试与时间相关的错误(据我所知,该错误在执行数月后出现)。我怀疑问题是使用一组仅包含 "bad/broken" 的文件描述符调用 pselect()
。
我想做什么
为了重现错误,我想 运行 程序并删除它正在使用的文件描述符(0、1 和 2 除外)。为此,我想在程序 运行ning 时转到 /proc/<pid>/fd
并取消链接文件描述符。
问题
当我用 gdb 调试程序时,给 pselect()
的文件描述符集如下所示:
{fds_bits = {16384, 8, 0 <repeats 30 times>}}
有什么方法可以从 fds_bits
中获取文件描述符吗?有没有其他方法可以实现我想做的事情?
宏FD_ISSET(nr, set)
等所做的基本上是将数组fds_bits解释为一个大的位域。位 n 代表文件描述符 n.
因此在第一个数组成员16384
(二进制 100000000000000)中设置了位 nr 14,表示文件描述符 14。
在第二个array-member中设置了8
(二进制1000),也就是第4位。数组成员的类型为 unsigned long int
,因此在 64-bit-machine 上,fdbits[1] 的最低有效位表示文件描述符 64,因此设置位表示文件描述符 68。在 32 位上机器这将是 fd 36 (32 + 4).
因此,您正在检查的 fd-set 代表两个文件描述符 14 和 68。
我正在调试与时间相关的错误(据我所知,该错误在执行数月后出现)。我怀疑问题是使用一组仅包含 "bad/broken" 的文件描述符调用 pselect()
。
我想做什么
为了重现错误,我想 运行 程序并删除它正在使用的文件描述符(0、1 和 2 除外)。为此,我想在程序 运行ning 时转到 /proc/<pid>/fd
并取消链接文件描述符。
问题
当我用 gdb 调试程序时,给 pselect()
的文件描述符集如下所示:
{fds_bits = {16384, 8, 0 <repeats 30 times>}}
有什么方法可以从 fds_bits
中获取文件描述符吗?有没有其他方法可以实现我想做的事情?
宏FD_ISSET(nr, set)
等所做的基本上是将数组fds_bits解释为一个大的位域。位 n 代表文件描述符 n.
因此在第一个数组成员16384
(二进制 100000000000000)中设置了位 nr 14,表示文件描述符 14。
在第二个array-member中设置了8
(二进制1000),也就是第4位。数组成员的类型为 unsigned long int
,因此在 64-bit-machine 上,fdbits[1] 的最低有效位表示文件描述符 64,因此设置位表示文件描述符 68。在 32 位上机器这将是 fd 36 (32 + 4).
因此,您正在检查的 fd-set 代表两个文件描述符 14 和 68。