sys readlink терпит неудачу EFAULT-альтернатива


У меня есть filedescriptor, и я хотел бы получить реальный путь. В настоящее время я вызываю 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);

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

2 2

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);

Обработка ошибок elided для краткости.

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

EDIT: похоже, вы программируете в режиме ядра. Оказывается, "реальный путь" в режиме ядра бессмыслен.