gpt4 book ai didi

linux - Linux 中使用 readdir() 的 Level 2 I/O 可能吗?

转载 作者:太空宇宙 更新时间:2023-11-04 09:37:54 25 4
gpt4 key购买 nike

我正在尝试遍历目录结构并打开该结构中的每个文件。为了遍历,我使用了 opendir() 和 readdir()。因为我已经有了实体,所以构建路径并打开文件似乎很愚蠢——这大概会强制 Linux 找到我刚刚遍历的目录和文件。

2 级 I/O(打开、创建、读取、写入)需要路径。是否有调用打开目录中的文件名或打开给定 inode 的文件的调用?

最佳答案

你可能应该使用 nftw(3)递归遍历文件树。

否则,以可移植的方式,使用例如构建目录+文件名路径

snprintf(pathbuf, sizeof(pathbuf), "%s/%s", dirname, filename);

(或者可能使用 asprintf(3) 但不要忘记稍后 free 结果)

要回答有关在目录中打开文件的问题,您可以使用 Linux 或 POSIX2008 特定 openat(2) .但我相信您应该真正使用 nftw 或按照上面的建议构建您的路径。另请阅读 open(2) 中的 O_PATHO_TMPFILE .

顺便说一句,内核必须多次访问目录(实际上,元数据由文件系统内核代码缓存),只是因为另一个进程可能在您遍历它时写入其中。

甚至不要通过文件的 inode 号打开文件:这将违反几个文件系统抽象! (但可能很难通过疯狂和令人作呕的技巧,例如 debugfs - 这可能会严重损害您的文件系统!!)。

请记住,文件通常是 inodes , 并且可以有零个(一个进程 open 然后 unlink(2) 一个文件,同时保持打开的文件描述符),一个(这是通常的情况),或几个(例如 /foo/bar1/gee/bar2 可以使用 link(2) ....) 文件名进行硬链接(hard link)。

一些文件系统(例如 FAT ...)没有真正的 inode 。在这种情况下,内核会伪造一些东西。

关于linux - Linux 中使用 readdir() 的 Level 2 I/O 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24575382/

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