2011-12-01 21 views
3

我正在開發一個項目,我必須打開一個目錄並在內核級讀取文件/目錄。我基本上試圖找出如何在內核級別實現ls如何使用該目錄的文件描述符在內核級別打開目錄?

現在我已經想出瞭如何使用sys_open()O_DIRECTORY flag來獲取目錄的文件描述符,但是我不知道如何讀取我接收到的fd。如果有人有任何提示或其他建議,我會很感激。 (請記住,這必須在內核級別完成)。

編輯:長話短說,對於一個學校項目,我正在實現文件/目錄屬性。存儲屬性的位置是與文件具有相同屬性的隱藏文件夾。 (因此,Desktop/MyFolder中的文件有一個名爲Desktop/MyFolder/.filename_attr的屬性文件夾。相信我,我不會在內核裏爲了自己的忙而亂搞。但是我需要在內核級別讀取目錄的原因是因爲它是項目規格的一部分。

+2

**爲什麼**你想這樣做?它被認爲是*不好的味道*。爲什麼你不能有助手*用戶地*程序? –

回答

5

要添加到咖啡館的答案提vfs_readdir(),讀,從內部內核被認爲是不安全寫入文件(除/proc,它作爲在內核內部數據結構的接口。)

的原因在this linuxjournal article中有很好的描述,雖然它們也提供了訪問文件的手段。我不認爲他們的方法可以很容易地修改爲用於目錄。更正確的方法是訪問內核的文件系統inode條目,這是vfs_readdir所做的。

節點是文件系統對象,如常規文件,目錄,FIFO和其他野獸。他們或者在光盤上(對於塊設備文件系統) 或存儲器中(對於僞文件系統)。

請注意,vfs_readdir()需要file *參數。要從用戶空間文件描述符中獲取file結構指針,應該使用內核的文件描述符表。

kernel.org files documentation上說這樣做安全如下:

要查找給出的FD文件結構,讀者 必須使用fcheck()fcheck_files()的API。這些 負責無鎖查找的屏障要求。 一個例子:

rcu_read_lock(); 
    file = fcheck_files(files, fd); 
    if (file) { 
     // Handling of the file structures is special. 
     // Since the look-up of the fd (fget()/fget_light()) 
     // are lock-free, it is possible that look-up may race with 
     // the last put() operation on the file structure. 
     // This is avoided using atomic_long_inc_not_zero() on ->f_count 
     if (atomic_long_inc_not_zero(&file->f_count)) 
      *fput_needed = 1; 
     else 
     /* Didn't get the reference, someone's freed */ 
      file = NULL; 
    } 
    rcu_read_unlock(); 
    .... 
    return file; 

atomic_long_inc_not_zero()檢測是否refcounts已經是零或 增量期間變爲零。如果是這樣,我們將失敗fget()/fget_light()

最後,看看filldir_t,第二個參數類型。

+0

偉大的用戶模式解決方案,但在內核模塊中可能無用。 –

+0

@BenVoigt:我很快就讀完了這個問題。更好? :) – Rob

+0

是的。學習了一些關於Linux文件處理的知識。 –

4

您可能想要vfs_readdir()來自fs/readdir.c

通常,儘管內核代碼不能讀取目錄,但用戶代碼卻可以。

相關問題