gpt4 book ai didi

linux - 什么决定了 getdents 返回的目录条目的顺序?

转载 作者:IT王子 更新时间:2023-10-29 00:20:09 26 4
gpt4 key购买 nike

背景是我有一个列出目录条目的现有应用程序; strace 显示它只是调用 getdents 并按照返回的顺序列出它们。我希望它们以与不带参数的 ls 调用相同的顺序显示。是否可以通过某种方式更新目录数据来实现这一点?

FS 是 ext4,如果这有什么区别的话。

最佳答案

如果您真的决心要改变这个程序的行为(我假设您没有可用的源代码),您可以使用LD_PRELOAD。 Hook 对 opendirreaddir 的调用,并将其替换为您自己的排序包装器。下面是一个这样的钩子(Hook)的例子:

#define _GNU_SOURCE 1
#include <stdio.h>
#include <dirent.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <string.h>

struct __dirstream
{
int __fd;
char *__data;
size_t __allocation;
size_t __offset;
size_t __size;
struct dirent __entry;
};

typedef struct _dirent_list {
struct dirent *value;
struct _dirent_list *next;
} dirent_list;

typedef struct _my_DIR {
struct __dirstream orig;
dirent_list *first_entry;
int first_readdir;
} my_DIR;

DIR *opendir(const char *name) {
DIR *(*orig_opendir)(const char*) = dlsym(RTLD_NEXT, "opendir");
DIR *dir = orig_opendir(name);

// save additional information along with the
// original DIR structure
my_DIR *my_dir = calloc(1, sizeof(*my_dir));
my_dir->first_readdir = 1;
memcpy(my_dir, dir, sizeof(*dir));
return (DIR*)my_dir;
}

struct dirent *readdir(DIR *dir) {
struct dirent *(*orig_readdir)(DIR*) = dlsym(RTLD_NEXT, "readdir");
my_DIR *my_dir = (my_DIR*)dir;
dirent_list *item;

if (my_dir->first_readdir) {
struct dirent *entry;
while ((entry = orig_readdir(dir))) {
// exercise for the reader:
// implement insertion sort here
item = calloc(1, sizeof(*item));
item->value = entry;
item->next = my_dir->first_entry;
my_dir->first_entry = item;
}
my_dir->first_readdir = 0;
}

if (!my_dir->first_entry)
return NULL;

item = my_dir->first_entry;
struct dirent *result = item->value;
my_dir->first_entry = item->next;
free(item);

return result;
}

它覆盖 opendirreaddir 以相反的顺序返回条目(您也可以调整它以进行排序)。这是将它与程序 test 一起使用的方式,该程序仅按接收顺序列出目录条目:

$ gcc -Wall -shared -fPIC -o libhookdir.so hookdir.c -ldl
$ ./test
..
test
.
hookdir.c
libhookdir.so
test.c
$ LD_PRELOAD=./libhookdir.so ./test
test.c
libhookdir.so
hookdir.c
.
test
..

哈!这行得通。我们只是 Hook 了一个 libc 函数。

关于linux - 什么决定了 getdents 返回的目录条目的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8866577/

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