Linux的file结构体和inode结构体怎么用
Linux的file结构体和inode结构体怎么用
本篇内容介绍了“Linux的file结构体和inode结构体怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
1. file 结构体
file 结构体代表一个打开的文件,系统中每个打开的文件在内核空间都有一个关联的 struct file。
它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。
注:在内核和驱动源代码中,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结构体怎么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注恰卡编程网网站,小编将为大家输出更多高质量的实用文章!
推荐阅读
-
linux怎么搭建ftp服务器(linux ftp命令)
linuxftp命令?很欢喜问本问题,此观点祝你好运吧!再连接ftp服务器。格式:ftp[hostname|ip-address...
-
linux怎么调出屏幕键盘(linux | 怎么打出来,管道符号怎么打)
linux|怎么打出来,管道符号怎么打?楼主,你好!“|”这个符号在linux环境称做“管道符”框输入方法:Shift键盘的“...
-
linux系统生成core文件(linux udp缓存配置)
linuxudp缓存配置?临时再添加:sysctl-w_max26214400无限制再添加:将以下行添加到中:_max26214...
-
linux Centos如何安装PHP7
linuxCentos如何安装PHP7今天小编给大家分享一下li...
-
PHP修改apk文件的comment实现
apk文件本身即为zip文件,在PHP中可以使用ZipArchive类中的setArchiveComment方...
-
干了10多年的php,还不会安装,是不是丢人
-
Linux编程的十大代码编辑器新鲜出炉,你用的入榜单了吗?
-
从7到8,CentOS又更新了什么
-
免费开源文本编辑器(调试器)Notepad++简体中文版更新到Ver 8.3
-
PHP伪协议的妙用