C 从fds_位提取文件描述符

C 从fds_位提取文件描述符,c,linux,debugging,posix,file-descriptor,C,Linux,Debugging,Posix,File Descriptor,我正在调试依赖于时间的bug(据我所知,这个bug是在执行数月后出现的)。我怀疑问题在于使用一组文件描述符调用pselect(),其中只包含“坏/坏”的描述符 我想做什么 为了重现错误,我想运行程序并删除它正在使用的文件描述符(0、1和2除外)。为了实现这一点,我想在程序运行时转到/proc//fd并取消文件描述器的链接 问题 当我用gdb调试程序时,提供给pselect()的文件描述符集如下所示: {fds_bits = {16384, 8, 0 <repeats 30 times>

我正在调试依赖于时间的bug(据我所知,这个bug是在执行数月后出现的)。我怀疑问题在于使用一组文件描述符调用
pselect()
,其中只包含“坏/坏”的描述符

我想做什么 为了重现错误,我想运行程序并删除它正在使用的文件描述符(0、1和2除外)。为了实现这一点,我想在程序运行时转到
/proc//fd
并取消文件描述器的链接

问题 当我用gdb调试程序时,提供给
pselect()
的文件描述符集如下所示:

{fds_bits = {16384, 8, 0 <repeats 30 times>}}
{fds_位={16384,8,0}

有没有办法从
fds\u位
获取文件描述符?有没有其他方法来实现我想要做的事情?

宏的作用是将数组的FD\U位解释为一个大的位字段。位n表示文件描述符n

因此,在第一个数组成员
16384
(二进制1000000000000)中设置了位nr14,它表示文件描述符14

在第二个数组中,设置了成员
8
(二进制1000),即第4位。数组成员的类型为
unsigned long int
,因此在64位计算机上,fdbits[1]的最低有效位表示文件描述符64,因此设置位表示文件描述符68。在32位机器上,这将是fd36(32+4)

因此,您正在检查的fd集一起表示两个文件描述符14和68