本文主要是介绍文件、描述符与索引节点总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Linux对文件的内容和描述符文件的信息给出了清楚地区分:
除了文件设备文件和特殊的文件系统,每个文件都由字符序列组成,文件内容不包含任何控制字符
文件系统处理文件需要的所有信息包含在inode数据结构里面,每个文件都有自己的索引节点,文件系统使用索引节点来标志文件
struct inode
{
struct hlist_head i_hash; 散列表
struct list_head i_list; 索引节点链表
struct list_head i_sb_list; 超级块链表
struct list_head i_dentry; 目录项链表
unsigned long i_ino; 节点号
atomic_t i_count; 引用计数
unsigned int i_nlink; 硬链接数
uid_t i_uid; 使用者id
gid_t i_gid; 使用组id
kdev_t i_rdev; 实际设备标识符
u64 i_version; 版本号
loff_t i_size; 字节为单位的文件大小
seqcount_t i_size_seqcount; 对i_size进行串行计数
struct timespec iatime; 最后访问时间
struct timespec imtime; 最后修改实际
struct timespec ictime; 最后改变时间
unsigned int i_blkbits; 以位为单位的块大小
blkcnt_t i_blocks; 文件块数
unsigned short i_bytes; 使用的字节数
umode_t i_mode; 访问权限
spinlock_t i_lock; 自旋锁
struct rw_semaphore i_alloc_sem; 嵌入i_sem内部
struct semaphore i_sem; 索引节点信号量
struct inode_operations *i_op; 索引节点操作表
struct file_operations *i_fop; 缺省的索引节点操作
struct super_block *i_sb; 相关超级块
struct file_lock *i_flock; 文件锁链表
struct address_space *i_mapping; 相关地址映射
struct address_space i_data; 设备地址映射
struct dquot *i_dquot[MAXQUOTAS];索引节点磁盘限额
struct list_head i_devices; 块设备链表
union
{
struct pipe_inode_info *i_pipe; 管道信息
struct block_device *i_bdev; 块设备驱动
struct cdev *i_cdev; 字符设备驱动
};
unsigned long i_dnotify_mask; 目录通知掩码
struct dnotify_struct *idnotify; 目录通知
struct list_head inotify_watches; 索引节点通知监测链表
struct mutex inotify_mutex 保护inotify_watches
unsigned long i_state; 状态标志
unsigned long dirtied_when; 第一次能脏数据时间
unsigned int i_flags; 文件系统标志
atomic_t i_writecount; 写着计数
void *i_security; 安全模块
void *i_private; fs私有指针
};
虽然文件系统及内核函数对索引节点的处理可能随系统而异。但是他们必须至少提供POSIX标准制定的一些特性:
1,文件类型
2,与文件相关的硬链接个数
3,以字节为单位的文件长度
4,设备标识符(包含文件的设备的标识符)
5,在文件系统中标志文件的索引节点
6,文件拥有者的UID
7,文件的用户组ID
8,几个时间戳,表征索引节点状态改变的时间、最好访问时间及修改时间
9,访问权限和文件模式
文件的潜在用户三种类型:
1,作为文件所有者用户
2,同组用户,不包括所有者
3,所有剩下的用户
文件权限的三种附加标记:
suid(set user ID)
进程执行一个文件时通常保持进程拥有者的UID。然而,如果设置了可执行suid的标志位,进程就获得了该文件拥有者的UID
sgid(set group ID)
进程执行一个文件时保持进程组的用户组ID。然而,如果设置了可执行文件sgid的标志位,进程就获得了该文件用户组的ID
sticky
设置了sticky标志位的可执行文件相当于想内核发出了一个请求,当程序执行结束以后,依然将它保留在内存(已过时)
当文件由一个进程创建时,文件拥有者的ID就是该进程的UID。
而其用户组ID可以是进程创建者的ID,也可以是父目录的ID,这取决于父目录sgid标志位的值
当用户访问一个普通文件或目录文件内容时,实际上市访问存储在硬盘块设备上的一些数据结构。因此,文件系统是硬盘分区物理组织的用户级视图
一个打开的文件对象包括:
文件操作的一些数据结构,如指定文件打开的一组标志,表示文件当前位置的偏移量字段
进程可以调用的一些内核函数指针
POSIX语义所支持的特性:
文件描述符表示进程与打开文件之间的交互,而打开文件对象包含了与这种交互相关的数据。同一个打开文件对象也行由
同一个进程中的几个文件描述符标志
几个进程也许同时打开同一文件
这篇关于文件、描述符与索引节点总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!