2011-11-21 73 views
2

我有filedescriptor和喜歡得到真正的路徑。目前,我打電話sys_readlink /proc/self/fd/<fd>有時工作,但通常我得到一個錯誤-14(-EFAULT)。sys_readlink失敗EFAULT - 替代

這裏是一些代碼:

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

是否有其他(可能更好)的方式來獲得從內核中的真實路徑?

回答

4

從任務結構中的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); 

爲簡潔起見,錯誤處理消失了。

+0

順便說一下,這將返回類似於從打開時間文件時進程根目錄路徑的內容。 – Joshua

2

-EFAULT意味着「buf」指針有問題。你有沒有先分配內存?

編輯:它看起來像你在內核模式編程。事實證明,「真正的路徑在內核模式下是沒有意義的。