从 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。