Мне нужно получить имя файла из данного файлового дескриптора, внутри небольшого модуля ядра Linux, который я написал. Я попробовал решение, указанное в Получение имени файла из дескриптора файла в C, но по какой-то причине он печатает значения мусора (при использовании readlink
on /proc/self/fd/NNN
, как указано в решении). Как я могу это сделать?
Как я могу получить имя файла из файлового дескриптора внутри модуля ядра?
Ответ 1
Не вызывать SYS_readlink
- использовать тот же метод, что procfs
, когда читается одна из этих ссылок. Начните с кода в proc_pid_readlink()
и proc_fd_link()
в fs/proc/base.c
.
В широком смысле, учитывая int fd
и a struct files_struct *files
из интересующей вас задачи (на которую вы ссылались), вы хотите:
char *tmp;
char *pathname;
struct file *file;
struct path *path;
spin_lock(&files->file_lock);
file = fcheck_files(files, fd);
if (!file) {
spin_unlock(&files->file_lock);
return -ENOENT;
}
path = &file->f_path;
path_get(path);
spin_unlock(&files->file_lock);
tmp = (char *)__get_free_page(GFP_KERNEL);
if (!tmp) {
path_put(path);
return -ENOMEM;
}
pathname = d_path(path, tmp, PAGE_SIZE);
path_put(path);
if (IS_ERR(pathname)) {
free_page((unsigned long)tmp);
return PTR_ERR(pathname);
}
/* do something here with pathname */
free_page((unsigned long)tmp);
Если ваш код работает в контексте процесса (например, вызывается через syscall), а дескриптор файла - из текущего процесса, вы можете использовать current->files
для текущей задачи struct files_struct *
.