我正在调试依赖于时间的bug(据我所知,该bug在执行数月后出现)。我怀疑问题是使用一组只包含“坏/坏”的文件描述符调用pselect()
我想做什么
为了重现错误,我想运行程序并删除它正在使用的文件描述符(除了0、1和2)。为了实现这一点,我想在程序运行时转到/proc/<pid>/fd并取消文件描述符的链接。
问题
当我用gdb调试程序时,给pselect()的一组文件描述符如下所示:

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

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

最佳答案

FD_ISSET(nr, set)等所做的基本上是将数组fds_位解释为一个大的位字段。位n表示文件描述符n。
因此,在第一个数组成员16384(二进制10000000000000)中设置了位nr 14,它表示文件描述符14。
在第二个数组中设置8(二进制1000),这是第4位。数组成员的类型是unsigned long int,因此在64位计算机上,fdbits[1]的最低有效位表示文件描述符64,因此设置的位表示文件描述符68。在32位机器上,这将是fd 36(32+4)。
因此,您正在检查的fd集合表示两个文件描述符14和68。

关于c - 从fds_bits提取文件描述符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41808346/

10-13 00:08