从fds_bits

时间:2017-01-23 14:12:39

标签: c linux debugging posix file-descriptor

我正在调试与时间相关的错误(据我所知,在执行数月后会出现错误)。我怀疑问题是调用pselect()一组文件描述符,其中只包含" bad / broken"那些。

我想做什么

为了重现错误,我想运行程序并删除它正在使用的文件描述符(除了0,1和2)。为实现这一目标,我希望在程序运行时转到/proc/<pid>/fd并取消链接文件解析器。

问题

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

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

有没有办法从fds_bits获取文件描述符?有没有其他方法可以实现我想做的事情?

1 个答案:

答案 0 :(得分:2)

FD_ISSET(nr, set)等所做的基本上是将数组fds_bits解释为大位域。位n表示filedescriptor n。

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

在第二个数组成员8(二进制1000)中设置,这是第4位。数组成员的类型为unsigned long int,因此在64位机器上,fdbits [1]的最低有效位表示filedescriptor 64,因此设置位代表filedescriptor 68.在32位机器上将是fd 36(32 + 4)。

因此,您正在检查的fd集合代表两个文件描述符14和68.