2013-06-18 37 views
1

我想知道在/sys/*的哪個文件中調用了函數static ssize_t sysfs_write_file(struct file *file, const char __user *buf, size_t count, loff_t *ppos)。問題是如何獲得文件名/路徑struct file *file如何通過在內核中創建struct文件來獲取文件名?

struct file { 
    mode_t f_mode; 
    loff_t f_pos; 
    unsigned short f_flags; 
    unsigned short f_count; 
    unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin; 
    struct file *f_next, *f_prev; 
    int f_owner;   /* pid or -pgrp where SIGIO should be sent */ 
    struct inode * f_inode; 
    struct file_operations * f_op; 
    unsigned long f_version; 
    void *private_data; /* needed for tty driver, and maybe others */ 
}; 

編輯: 我知道有索引節點之間沒有一個一對一的映射到一個名字,但我必須知道主/次/文件描述符,可以尋找一些inode在文件系統中的名稱。

+0

你需要什麼的名字? –

回答

3

在Linux和其他類Unix操作系統中,文件對象可以用任意數量的名稱指向,文件對象本身也沒有指向其中任何一個的指針。名稱不是該文件的一個功能,它們只是一個外部索引。

+0

如果是設備,我可以獲取文件的主要和次要文件嗎?我怎樣才能從文件指針映射回文件系統中的路徑? – 0x90

+0

文件指針有一個指向inode的指針,它將包含像設備編號等數據。但是你錯過了這個觀點:一個打開的文件沒有名字。你可能已經使用過它的名字,但這是一個基本的單向操作。 –

+0

我沒有錯過這一點,但我的問題是如何從指針映射回文件系統上的文件,並且它似乎是可能的。 – 0x90

2

實際上,您可以檢索用於打開文件的文件路徑。在linux結構文件中表示一個打開的文件,並具有用於打開與該結構關聯的文件的路徑。在2.6.20之前,它是一個名爲f_dentry的成員,從2.6.20開始,它是一個名爲f_path的新成員。您可以使用函數d_path()直接檢索文件的完整路徑。

請參考下面的Linux的源代碼:

http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.10#L763

http://lxr.free-electrons.com/source/fs/dcache.c?v=3.0#L2626

而且還回答: How can I get a filename from a file descriptor inside a kernel module?

+1

實際的代碼將取決於您正在使用的內核版本,因爲struct file和d_path()隨時間而改變。您可以參考另一個問題中的代碼作爲參考 - 只需忽略獲取指向struct文件的指針的部分,就像您已經擁有它。 – logicor

相關問題