2011-11-23 92 views
13

我需要從給定的文件描述符中獲取一個文件的名稱,這個文件位於我編寫的一個小型Linux內核模塊中。我試着在Getting Filename from file descriptor in C給出的解決方案,但由於某種原因,它打印出垃圾值(使用解決方案中提到的/proc/self/fd/NNN上的readlink)。我該怎麼做?如何從內核模塊中的文件描述符獲取文件名?

+0

可能重複的[sys_readlink失敗EFAULT - 替代](http://stackoverflow.com/questions/8216871/sys-readlink-fails-efault-alternative) – ephemient

回答

21

不要調用SYS_readlink - 使用與procfs讀取其中一個鏈接時相同的方法。從proc_pid_readlink()和中的代碼開始fs/proc/base.c

廣義上講,給予int fd,並從你感興趣的(你已採取的引用)的任務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); 

如果你的代碼在運行過程 - 上下文(例如,通過系統調用調用)並且文件描述符來自當前進程,那麼當前任務的struct files_struct *可以使用current->files

+0

不錯。這工作。謝謝!儘管問題很快。 'path_get'和'path_put'調用的用途是什麼(因爲刪除它們對我的程序沒有太大影響)?另外,任何想法爲什麼不會'sys_readlink'工作? – Siddhant

+1

@Siddhant:'path_get()'和'path_put()'調用對於正確性是必需的,因爲它們固定路徑,以便在嘗試使用它時不會消失(所有'struct path' contains是一對指針,指向'struct vfsmount'和'struct dentry')。 – caf

+0

啊哈。再次感謝! – Siddhant