文件、描述符与索引节点总结

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语义所支持的特性:

文件描述符表示进程与打开文件之间的交互,而打开文件对象包含了与这种交互相关的数据。同一个打开文件对象也行由

同一个进程中的几个文件描述符标志

几个进程也许同时打开同一文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值