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; 硬链接数
id
id
 kdev_t i_rdev; 实际设备标识符
 u64 i_version; 版本号
 loff_t i_size; 字节为单位的文件大小
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; 自旋锁
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 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; 目录通知
索引节点通知监测链表
inotify_watches
 unsigned  long i_state; 状态标志
 unsigned  long dirtied_when; 第一次能脏数据时间
 unsigned  int  i_flags; 文件系统标志
 atomic_t i_writecount; 写着计数
 void *i_security; 安全模块
; 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语义所支持的特性:

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

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

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