我正在调试与时间相关的错误(据我所知,在执行数月后会出现错误)。我怀疑问题是调用pselect()
一组文件描述符,其中只包含" bad / broken"那些。
为了重现错误,我想运行程序并删除它正在使用的文件描述符(除了0,1和2)。为实现这一目标,我希望在程序运行时转到/proc/<pid>/fd
并取消链接文件解析器。
当我使用gdb调试程序时,给pselect()
的文件描述符集如下所示:
{fds_bits = {16384, 8, 0 <repeats 30 times>}}
有没有办法从fds_bits
获取文件描述符?有没有其他方法可以实现我想做的事情?
答案 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.