readdir(3)奇怪的行为:在/ dev /中查找不存在的文件

时间:2011-08-03 03:18:54

标签: c implementation ls readdir

我正在使用opendir / readdir / closedir来重现类似于ls的程序,直到我尝试使用递归选项的“/ dev / fd /”来尝试ls“/ dev /”时,它一直很顺利,它找到的文件比实际存在的多,这些文件不是隐藏文件(我的意思是'。'开始文件)。 真正的ls给了我: “/ dev / fd /:” “0 1 2 3” 我也是。 但是,问题是在gdb中,它发现另外3个文件是4,5和6.我听说gdb创建了他自己的环境,所以让我们忘记这一点。 当我尝试ls“/ dev / fd /” - R时,真正的ls会在我的程序给出时立即停止列表:

“的/ dev / FD / 3:”

“的/ dev / FD / 3/3 /”

“的/ dev / FD / 3/3 /......../ 10”

至少在40个文件之后

stat返回-1但执行仍在继续:分段错误。

在我的计算机中,“/ dev / fd / 3 /”等符号链接,宏“S_ISDIR”在现有文件上返回0但在非现有文件上返回0:“/ dev / fd / 6 / “它返回1 ......

我想知道为什么我的程序出错而真正的ls没有,我注意到我在我的计算机上使用stat64但是当我这样做仍然出错...它也使用fstat64,futex和其他系统调用我不知道。

我可以向您展示一些我的代码或详细信息,我很难为此解释我很抱歉。

谢谢你。

PS:我没有在readdir联机帮助页中获得该语句:“readdir返回的数据可能被后续调用readdir的同一目录流覆盖”

1 个答案:

答案 0 :(得分:1)

  

PS:我在readdir联机帮助页中没有得到该声明:“数据   readdir返回的内容可能会被后续的readdir调用覆盖   对于相同的目录流“

他们基本上说的是该函数不是可重入的,并且readdir返回的指针不应该简单地作为唯一值缓存,因为指向的基础数据将下次调用readdir函数时更改。基本上,它们允许实现定义可由函数循环的静态分配数据,或由OS管理的动态内存,以便readdir的调用者不必担心管理指向的内存。 readdir的返回值。例如,对于样本函数,如:

int* my_sample_increment()
{
    static int val = 0;
    val++;

    return &val;
}

如果您要做类似

的事情
int* int_ptr_1 = my_sample_increment();
int* int_ptr_2 = my_sample_increment();

然后,int_ptr_1int_ptr_2都会指向相同的值,在这种情况下,它将是值1。每个指针都不会指向唯一的整数值。

readdir也是如此。您不能简单地调用readdir并存储返回的指针,期望在以后使用它,而不会在您保存的时间之间通过对readdir的任何后续调用修改指向的数据。指针,以及你使用它的时间。如果您需要此类功能,那就是可重入版本readdir_r的用途。