我需要從給定的文件描述符中獲取一個文件的名稱,這個文件位於我編寫的一個小型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. 從Linux內核模塊的文件描述符中獲取文件名/路徑?
- 2. 如何從文件描述符獲取文件名和路徑?
- 3. 如何從內核源文件簽名內核模塊?
- 4. 如何從python中的下載url獲取文件描述符?
- 5. 如何從文件描述符獲得內核空間的絕對路徑
- 6. C從文件描述符中讀取
- 7. 如何從文件描述符中獲取FILE *流?
- 8. 從文件描述符獲取文件指針
- 9. 從文件描述符重命名?
- 10. 獲取文件描述符在Perl
- 11. 如何從* .ko文件獲取默認的內核模塊名稱?
- 12. Node.js從模塊內部獲取模塊的文件名?
- 13. 如何僅從已更改的文件描述符中讀取
- 14. 文件描述符飢餓和阻斷文件描述符
- 15. 如何獲取打開文件描述符的數量?
- 16. 如何在內存中獲取緩衝區的文件描述符?
- 17. 從xsl模板獲取xml文件的描述
- 18. 如何從shell腳本的後臺讀取文件描述符
- 19. 解決文件描述符文件名/文件路徑
- 20. 如何從內核崩潰vmcores獲取信息時將內核模塊作爲名稱文件傳遞給libkvm
- 21. 內核日誌「文件描述符」用於select?
- 22. Linux內核 - 套接字文件描述符關閉位置
- 23. Linux內核 - 檢查是否有文件描述符
- 24. 調試文件描述符泄漏(在內核?)
- 25. 如何使用Delphi從文件擴展名中獲取圖標和描述?
- 26. 如何寫入Bash中的命名文件描述符?
- 27. UNIX內核如何從文件名獲取inode?
- 28. 如何在Android上使用文件描述符獲取文件路徑?
- 29. 無法獲取文件描述符從零MQ ZMQ_SERVER套接字
- 30. 從OSX CoreServices對象獲取BSD文件描述符
可能重複的[sys_readlink失敗EFAULT - 替代](http://stackoverflow.com/questions/8216871/sys-readlink-fails-efault-alternative) – ephemient