Linux的file结构体和inode结构体怎么用

Linux的file结构体和inode结构体怎么用

本篇内容介绍了“Linux的file结构体和inode结构体怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1. file 结构体

file 结构体代表一个打开的文件,系统中每个打开的文件在内核空间都有一个关联的 struct file。

Linux的file结构体和inode结构体怎么用

它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。

注:在内核和驱动源代码中,struct file 的指针通常被命名为 file 或 filp(即 file pointer)。

structfile{union{structllist_nodefu_llist;structrcu_headfu_rcuhead;}f_u;structpathf_path;structinode*f_inode;/*cachedvalue*/conststructfile_operations*f_op;/*和文件关联的操作*//**Protectsf_ep_links,f_flags.*MustnotbetakenfromIRQcontext.*/spinlock_tf_lock;enumrw_hintf_write_hint;atomic_long_tf_count;unsignedintf_flags;/*文件标志,如O_RDONLY、O_NONBLOCK、O_SYNC*/fmode_tf_mode;/*文件读/写模式,FMODE_READ、FMODE_WRITE*/structmutexf_pos_lock;loff_tf_pos;/*当前读写位置*/structfown_structf_owner;conststructcred*f_cred;structfile_ra_statef_ra;u64f_version;#ifdefCONFIG_SECURITYvoid*f_security;#endif/*neededforttydriver,andmaybeothers*/void*private_data;/*文件私有数据*/#ifdefCONFIG_EPOLL/*Usedbyfs/eventpoll.ctolinkallthehookstothisfile*/structlist_headf_ep_links;structlist_headf_tfile_llink;#endif/*#ifdefCONFIG_EPOLL*/structaddress_space*f_mapping;errseq_tf_wb_err;}__randomize_layout__attribute__((aligned(4)));/*lestsomethingweirddecidesthat2isOK*/structfile_handle{__u32handle_bytes;inthandle_type;/*fileidentifier*/unsignedcharf_handle[0];};

文件读/写模式 mode、标志 f_flags 都是设备驱动关心的内容,而私有数据指针 private_data 在设备驱动中被广泛应用,大多被指向设备驱动自定义以用于描述设备的结构体。

2. inode 结构体

VFS inode 包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改事件等信息。它是 Linux 管理文件系统的基本单位,也是文件系统连接任何子目录、文件的桥梁,inode 结构体的定义如下:

structinode{

umode_ti_mode;

/*inode的权限*/

unsignedshorti_opflags;

kuid_ti_uid;

/*inode拥有者的id*/

kgid_ti_gid;

/*inode所属的群组id*/

unsignedinti_flags;

#ifdefCONFIG_FS_POSIX_ACL

structposix_acl*i_acl;

structposix_acl*i_default_acl;

#endif

conststructinode_operations*i_op;

structsuper_block*i_sb;

structaddress_space*i_mapping;

#ifdefCONFIG_SECURITY

void*i_security;

#endif

/*Statdata,notaccessedfrompathwalking*/

unsignedlongi_ino;

/*

*Filesystemsmayonlyreadi_nlinkdirectly.Theyshallusethe

*followingfunctionsformodification:

*

*(set|clear|inc|drop)_nlink

*inode_(inc|dec)_link_count

*/

union{

constunsignedinti_nlink;

unsignedint__i_nlink;

};

dev_ti_rdev;

/*若是设备文件,此字段将记录设备的设备号*/

loff_ti_size;

/*inode所代表的文件大小*/

structtimespeci_atime;

/*inode最近一次的存取时间*/

structtimespeci_mtime;

/*inode最近一次的修改时间*/

structtimespeci_ctime;

/*inode的产生时间*/

spinlock_ti_lock;

/*i_blocks,i_bytes,maybei_size*/

unsignedshorti_bytes;

unsignedinti_blkbits;

enumrw_hinti_write_hint;

blkcnt_ti_blocks;

/*inode所使用的block数,一个block为512字节*/

#ifdef__NEED_I_SIZE_ORDERED

seqcount_ti_size_seqcount;

#endif

/*Misc*/

unsignedlongi_state;

structrw_semaphorei_rwsem;

unsignedlongdirtied_when;

/*jiffiesoffirstdirtying*/

unsignedlongdirtied_time_when;

structhlist_nodei_hash;

structlist_headi_io_list;

/*backingdevIOlist*/

#ifdefCONFIG_CGROUP_WRITEBACK

structbdi_writeback*i_wb;

/*theassociatedcgroupwb*/

/*foreigninodedetection,seewbc_detach_inode()*/

inti_wb_frn_winner;

u16i_wb_frn_avg_time;

u16i_wb_frn_history;

#endif

structlist_headi_lru;

/*inodeLRUlist*/

structlist_headi_sb_list;

structlist_headi_wb_list;

/*backingdevwritebacklist*/

union{

structhlist_headi_dentry;

structrcu_headi_rcu;

};

u64i_version;

atomic_ti_count;

atomic_ti_dio_count;

atomic_ti_writecount;

#ifdefCONFIG_IMA

atomic_ti_readcount;

/*structfilesopenRO*/

#endif

conststructfile_operations*i_fop;

/*former->i_op->default_file_ops*/

structfile_lock_context*i_flctx;

structaddress_spacei_data;

structlist_headi_devices;

union{

structpipe_inode_info*i_pipe;

structblock_device*i_bdev;

/*若是块设备,为其对应的block_device结构体指针*/

structcdev*i_cdev;

/*若是字符设备,为其对应的cdev结构体指针*/

char*i_link;

unsignedi_dir_seq;

};

__u32i_generation;

#ifdefCONFIG_FSNOTIFY

__u32i_fsnotify_mask;

/*alleventsthisinodecaresabout*/

structfsnotify_mark_connector__rcu*i_fsnotify_marks;

#endif

#ifIS_ENABLED(CONFIG_FS_ENCRYPTION)

structfscrypt_info*i_crypt_info;

#endif

void*i_private;

/*fsordeviceprivatepointer*/


}__randomize_layout;

“Linux的file结构体和inode结构体怎么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注恰卡编程网网站,小编将为大家输出更多高质量的实用文章!

发布于 2022-02-07 23:12:54
收藏
分享
海报
0 条评论
45
上一篇:Linux alias命令怎么用 下一篇:Linux系统下怎么使用Mysql导入SQL文件
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码