sys_readlink не работает EFAULT — альтернатива

У меня есть дескриптор файла, и я хотел бы получить реальный путь. В настоящее время я вызываю sys_readlink /proc/self/fd/<fd>, что иногда работает, но часто я получаю сообщение об ошибке -14 (-EFAULT).

Вот код:

fs = get_fs();
set_fs(KERNEL_DS);
err = sys_readlink(path, buf, size-1);
set_fs(fs);

Есть ли альтернативный (возможно, лучший) способ получить реальный путь из ядра?


person user1058382    schedule 21.11.2011    source источник


Ответы (2)


Получите его из файла в структуре задачи, например. что-то типа

struct task_struct *task;
struct files_struct *files;
struct file *file;
char buf[buflen], *realpath;

task = current /* or some other task */;
get_task_struct(task);
files = get_files_struct(task);
put_task_struct(task);
spin_lock(&files->file_lock);
file = fcheck_files(files, fdno);
realpath = d_path(file->f_path, buf, buflen);
spin_unlock(&files->file_lock);
put_files_struct(files);

Обработка ошибок опущена для краткости.

person ephemient    schedule 21.11.2011
comment
Кстати, это возвращает что-то вроде пути из корневого каталога процесса во время открытия файла. - person Joshua; 22.11.2011

-EFAULT означает, что что-то не так с указателем "buf". Вы сначала выделили память?

РЕДАКТИРОВАТЬ: похоже, вы программируете в режиме ядра. Оказывается, «настоящий» путь не имеет смысла в режиме ядра.

person Joshua    schedule 21.11.2011