gpt4 book ai didi

c - readdir(3) 奇怪的行为 : finding non existing files in/dev/

转载 作者:行者123 更新时间:2023-11-30 16:01:16 25 4
gpt4 key购买 nike

我正在使用 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/”等都是符号链接(symbolic link),宏“S_ISDIR”在现有文件上返回 0,但在不存在的文件上返回 0,例如:“/dev/fd/6/“它返回1...

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

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

谢谢你。

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

最佳答案

PS : I don't get that statement in the readdir manpage : "The data returned by readdir may be overwritten by subsequent calls to readdir for the same directory stream"

他们基本上想说的是,该函数是不可重入的,并且 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_1int_ptr_2 将指向相同的值,在本例中它将是值 1。每个指针不会指向唯一的整数值。

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

关于c - readdir(3) 奇怪的行为 : finding non existing files in/dev/,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6921277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com