sys_readlink завершается ошибкой EFAULT - альтернатива - PullRequest
2 голосов
/ 21 ноября 2011

У меня есть файловый дескриптор, и мне нравится получать реальный путь.В настоящее время я вызываю 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 ]

4 голосов
/ 22 ноября 2011

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

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

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

2 голосов
/ 21 ноября 2011

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

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

...