readdir(3) 奇怪的行为:在 /dev/

问题描述 投票:0回答:2

我正在使用 opendir / readdir / closeir 来重现一个类似于 ls 的程序,它运行得很好,直到我尝试 ls "/dev/" 当涉及到 "/dev/fd/" 时使用递归选项,它发现文件比实际存在的文件多,这些不是隐藏文件(我的意思是“.”开头的文件)。 真正的 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”

stat 至少在 40 个文件后返回 -1,但执行继续:分段错误。

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

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

我可以向您展示我的代码示例或更多细节,这真的很难为我解释,对此我感到很抱歉。

谢谢你。

PS:我在 readdir 手册页中没有得到该声明:“readdir 返回的数据可能会被同一目录流的 readdir 的后续调用覆盖”

c implementation ls readdir
2个回答
0
投票

PS:我在 readdir 手册页中没有得到该声明:“数据 readdir 返回的结果可能会被后续调用 readdir 覆盖 对于同一目录流”

他们基本上想说的是,该函数是不可重入的,并且

readdir
返回的指针不应该简单地缓存为唯一值,因为所指向的基础数据下次会改变您调用
readdir
函数。基本上,它们允许实现定义可由函数回收的静态分配的数据,或由操作系统管理的动态内存,以便
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_1
int_ptr_2
都将指向相同的值,在本例中它将是值
1
。每个指针不会指向唯一的整数值。

所以

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


0
投票

Then both int_ptr_1 and int_ptr_2 will point to the same value, and in this case it will be the value 1.
接近但非常错误。它们都将指向“2”,因为它被调用了两次。不知道是谁投了如此错误的票。我确信这是另一个 stackoverflow 异常。

© www.soinside.com 2019 - 2024. All rights reserved.