linux 核心中根據inode得到檔名

2021-06-26 18:39:46 字數 3899 閱讀 9950

核心程式設計中,操作的物件往往是inode,但是如何根據inode得到檔名呢,或者找到對應於檔案系統的位置呢?

527 struct inode ;

560 dev_t i_rdev;

561 loff_t i_size;

562 struct timespec i_atime;

563 struct timespec i_mtime;

564 struct timespec i_ctime;

565 spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */

566 unsigned short i_bytes;

567 unsigned int i_blkbits;

568 blkcnt_t i_blocks;

569

570 #ifdef __need_i_size_ordered

571 seqcount_t i_size_seqcount;

572 #endif

573

574 /* misc */

575 unsigned long i_state;

576 struct mutex i_mutex;

577

578 unsigned long dirtied_when; /* jiffies of first dirtying */

579

580 struct hlist_node i_hash;

581 struct list_head i_wb_list; /* backing dev io list */

582 struct list_head i_lru; /* inode lru list */

583 struct list_head i_sb_list;

584 union ;

588 u64 i_version;

589 atomic_t i_count;

590 atomic_t i_dio_count;

591 atomic_t i_writecount;

592 #ifdef config_ima

593 atomic_t i_readcount; /* struct files open ro */

594 #endif

595 const struct file_operations *i_fop; /* former ->i_op->default_file_ops */

596 struct file_lock *i_flock;

597 struct address_space i_data;

598 #ifdef config_quota

599 struct dquot *i_dquot[maxquotas];

600 #endif

601 struct list_head i_devices;

602 union ;

607

608 __u32 i_generation;

609

610 #ifdef config_fsnotify

611 __u32 i_fsnotify_mask; /* all events this inode cares about */

612 struct hlist_head i_fsnotify_marks;

613 #endif

614

615 void *i_private; /* fs or device private pointer */

616 };

以上是inode結構體的定義,在linux/fs中,仔細看上n邊也沒有發現乙個跟名字有關的東西,比如i_name【筆者意淫的】,為什麼沒有名稱呢,那如何才能找到名稱呢?

我覺得出現以上的問題,應該是對linux的檔案系統了解不夠,或者說不明白什麼是inode。inode是在linux的虛擬檔案系統之上統一出來的對任何檔案型別的記憶體中版本。什麼意思,就是說inode這個結構體是在記憶體中,對應的ext2檔案系統也有乙個inode的硬碟版本ext2_inode。inode結構體用union記錄不同的檔案型別,但是他們總體抽象成inode,這是一種虛擬化的思想。這也是為什麼linux的vfs強大的原因。

檔案系統除了inode結構體外,還有個dentry結構體,翻譯一般叫目錄項,inode的i_dentry指向inode的目錄項,而dentry中的d_inode指向相應的inode結構。那麼他們是不是一一對應的呢?答案是,inode與dentry是多對一的關係,為什麼呢,因為乙個inode可以對應多個不同位置【目錄項】的不同檔名的檔案,但是這些檔案在核心中的表現形式都是這個inode,現在應該能夠明白為什麼inode為什麼沒有記錄檔名和檔案位置了吧,因為這個多對一的關係。

dentry和inode是從不同的兩個角度描述檔案的屬性,dentry表示的是邏輯意義上的檔案【也就是我們看到的/usr/abc.txt】而inode表示的是物理意義上的檔案【也就是記憶體中的表示體】。那麼如何從inode得到正確的dentry?

核心為了設計一種適應所有型別的鍊錶,使用了一種非常巧妙的機制,就是把乙個固定型別的雙向鍊錶list_head加入某一結構體中,這樣就通過該鍊錶將某一結構體組織成煉表形式,是不是很聰明?而且核心提供了針對鍊錶的操作幾乎所有函式,使用巨集定義完成。這樣也減輕了核心設計人員的工作。

再回到上面問題,inode有乙個list_head型別的雙向鍊錶指向i_dentry,只要在裡面遍歷就能找到正確的dentry結構。

**如下:

char *getfullpath(struct inode *inod,char* buffer,int len)

} if(dent == null)

name = (char*)(dent->d_name.name);

name = name + strlen(name) - 4;

if(!strcmp(name,".img"))

}printk(kern_info "the fullname is :%s \n",pbuf);

} return pbuf;

}

dentry結構中有乙個d_name對應的就是檔名,d_parent指向目錄項的上一級目錄【/usr/src/linux中linux的parent就是src】所以一級級遍歷就能找到檔案的全路徑!

linux的核心設計是一種極其機智巧妙的藝術品,各位蝦公尺在學習的時候要注意從整個設計思路上體會他的靈魂,切忌鑽到某個細節而「走火入魔」啊~~

**請說明

linux核心inode結構

inode是linux核心的檔案系統裡邊最重要的資料結構,可以說,乙個inode就代表了乙個檔案,inode結構體儲存了檔案的大小,建立時間,檔案的塊大小等各種引數,乙個檔案可以有多個dentry,因為在linux裡由於軟連線,硬連線的存在,指向乙個檔案的路徑可能有多個,但是乙個檔案的inode只能...

Linux核心中的list for each

在linux核心原始碼中,經常要對鍊錶進行操作,其中乙個很重要的巨集是list for each entry 意思大體如下 假設只有兩個結點,則第乙個member代表head,list for each entry的作用就是迴圈遍歷每乙個pos中的member子項。巨集list for each e...

linux核心中container of詳解

在linux 核心中,container of 函式使用非常廣,例如 linux核心鍊錶 list head 工作佇列work struct中。在linux 核心中有乙個大名鼎鼎的巨集container of 這個巨集是用來幹嘛的呢?我們先來看看它在核心中是怎樣定義的。呵呵,乍一看不知道是什麼東東。...