2013-07-06 77 views
3

在linux內核模塊中,有一種方法可以從unsigned int fd獲取文件名/路徑?從Linux內核模塊的文件描述符中獲取文件名/路徑?

我知道這個答案:How can I get a filename from a file descriptor inside a kernel module?但如果我明白代碼正確,我還需要一個struct files_struct

編輯:

的複製,因爲它是不請停止投票。我正在尋求一種從內核模塊以普通的C語言獲取文件名/路徑的方法,而不是使用系統工具。 用另一種方式說:在/ procself/fd /上運行readlink是而不是一個很好的答案。

編輯2:

內核的系統調用讀ssize_t read(int fd, void *buf, size_t count);接受3個參數,其中之一是一個FD。很顯然,read能夠從單個文件(而不是inode中的所有文件)讀取。問題是如何。

+0

在硬鏈接的情況下,文件可能有多個路徑 - 您如何知道自己有合適的路徑? –

+0

可能重複的[從文件描述符獲取文件名在C](http://stackoverflow.com/questions/1188757/getting-filename-from-file-descriptor-in-c) –

+0

@CarlNorum也許這可以通過返回一串字符串。 – 2013-07-06 16:33:59

回答

3

您參考的問題的答案中的代碼是您需要執行的操作。是的,需要來自任務的struct files_struct,因爲文件描述符僅在files_struct(通常每個進程都有其中一個)的上下文中有意義。它們不是全球唯一的,只是單個打開文件表中的索引。

如果您的代碼在進程上下文中運行(例如,通過系統調用調用),那麼您可以使用current->files作爲當前任務的files_struct。這是read()所做的。

+0

我從系統調用運行,所以,是的,我可以得到current->文件。這就是我在閱讀了幾個小時後所得到的結果,但我得到了垃圾,而不是我真正想要的東西。錯誤在哪裏? http://pastebin.com/RNrGRVsC – alexandernst

+0

@alexandernst:你沒有做正確的鎖定/ rcu解引用,你忽略了'qstr-> len',你只能訪問路徑的最後一個元素。使用http://stackoverflow.com/a/8250940/134633中顯示的幫助函數。 – caf

+0

對不起,我花了這麼長時間回覆。你從另一個問題的答案確實有效,我只是沒有做到正確的方式。這就是我的功能如下:http://pastebin.com/707W1JDR我有一個小問題。我不需要kfree什麼path_from_fd返回,對吧? – alexandernst