我需要從給定的文件描述符中獲取一個文件的名稱,這個文件位於我編寫的一個小型Linux內核模塊中。我試着在Getting Filename from file descriptor in C給出的解決方案,但由於某種原因,它打印出垃圾值(使用解決方案中提到的/proc/self/fd/NNN
上的readlink
)。我該怎麼做?如何從內核模塊中的文件描述符獲取文件名?
13
A
回答
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
。
相關問題
- 1. 如何從python中的下載url獲取文件描述符?
- 2. 如何從文件描述符中獲取FILE *流?
- 3. 從文件描述符獲取文件指針
- 4. 如何從* .ko文件獲取默認的內核模塊名稱?
- 5. 如何在內存中獲取緩衝區的文件描述符?
- 6. 從xsl模板獲取xml文件的描述
- 7. 如何從shell腳本的後臺讀取文件描述符
- 8. 調試文件描述符泄漏(在內核?)
- 9. Linux內核 - 檢查是否有文件描述符
- 10. Linux內核 - 套接字文件描述符關閉位置
- 11. 如何使用Delphi從文件擴展名中獲取圖標和描述?
- 12. 如何寫入Bash中的命名文件描述符?
- 13. UNIX內核如何從文件名獲取inode?
- 14. 從pyhandle獲取文件描述符時遇到困難
- 15. 從OSX CoreServices對象獲取BSD文件描述符
- 16. 無法獲取文件描述符從零MQ ZMQ_SERVER套接字
- 17. 在POSIX系統中從文件名中獲取文件描述符 - 或者如何關閉僅包含文件名的文件
- 18. 文件描述符和打開文件
- 19. 在內核模塊中獲取文件系統掛載點
- 20. webservice描述符文件
- 21. 關閉文件描述符
- 22. 創建文件描述符
- 23. Linux open()文件描述符
- 24. 寫作文件描述符
- 25. 實現文件描述符
- 26. 文件描述符輪詢
- 27. c strcpy文件描述符
- 28. 如何在Linux內核模塊中讀取/寫入文件?
- 29. 在Python中獲取文件描述符的位置
- 30. 如何獲取內核頭文件?
可能重複的[sys_readlink失敗EFAULT - 替代](http://stackoverflow.com/questions/8216871/sys-readlink-fails-efault-alternative) – ephemient