是什么决定了 getdents 返回目录条目的顺序?
背景是我有一个现有的应用程序,其中列出了目录条目; strace 显示它只是调用 getdents 并按返回的顺序列出它们。我希望它们以与不带参数调用 ls 相同的顺序显示。是否可以通过某种方式更新目录数据来实现此目的?
FS 是 ext4,如果这有什么区别的话。
Background is I have an existing application which lists directory entries; strace reveals it just calls getdents and lists them in the order returned. I would like them displayed in the same order as a call to ls with no arguments. Is it possible to update the directory data in some way to achieve this?
FS is ext4, if that makes any difference.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您真的决心更改此程序的行为(我假设您没有可用的源代码),您可以使用
LD_PRELOAD
将调用挂钩到opendir
和readdir
并将其替换为您的自己的排序包装器。此类挂钩的示例如下:它重写
opendir
和readdir
以相反的顺序返回条目(您也可以调整它以进行排序)。这就是您如何将它与程序test
一起使用,该程序只是按照收到的顺序列出目录条目:哈!这有效。我们刚刚挂接了一个 libc 函数。
If you really are determined to change this program's behaviour (of which I assume that you don't have the source code available), you can use
LD_PRELOAD
to hook the call toopendir
andreaddir
and replace it with your own, sorting wrapper. An example how such a hook could look like is the following:It overrides
opendir
andreaddir
to return the entries in reverse order (you can adapt this for sorting too). This is how you use it with a programtest
that simply lists the directory entries in the order they are received:Hah! This works. We just hooked a libc function.
不,您无法操作文件系统元数据,使
getdents(2)
按照与ls(1)
应用的排序顺序相同的顺序返回整个目录目录完整。您始终可以修改程序以使用 ls(1) 提供的相同算法对条目进行排序,尽管这至少需要 O(N) 内存和 O(N Log N) 时间来对目录进行排序N 个条目。您必须决定是否值得实施、内存和时间,以与
ls(1)
相同的方式进行排序。No, there is no way you can manipulate the filesystem metadata to have
getdents(2)
return directory entires in the same order as the sort order thatls(1)
applies to the directory entires.You can always modify your program to sort entries using the same algorithms that
ls(1)
provides, though this requires at least O(N) memory and O(N Log N) time for sorting a directory with N entries. You'll have to decide if it is worth the implementation, memory, and time, to sort in the same manner asls(1)
.