Unix文件系统概述
文件
- Unix文件是以字节序列组成的信息载体,不解释内容。
- 文件被组织在一个树结构的命名空间中。
- . 和..的意思硬链接和软链接
- 包含在目录中的文件名就是一个文件的硬链接
- 命令:$ln P1 P2 用来创建一个新的硬链接,为路径P1创建一个名为P2的硬链接。
- 不允许用户给目录创建硬链接
- 只有同一个文件系统中的文件之间才能创建链接
-
软链接(符号链接)
符号链接是短文件,包含另一个文件的任意一个路径名。
ln -s P1 P2 创建一个路径名为P2的软链接,P2指向路径名P1。
文件类型
- 普通文件
- 目录
- 符号链接
- 面向块的设备文件
- 面向字符的设备文件
- 管道和命名管道FIFO
- 套接字
文件描述符和索引节点
- 文件内容不包含任何控制信息(长度。文件结束符EOF)
- 文件系统处理文件需要的信息都包含在一个名为索引结点的数据结构中
- 每个文件都有自己的索引节点,索引节点来标识文件
- 至少包含:
1.文件类型
2.文件相关的硬链接数
3.以字节为单位的文件长度
4.设备标识符
5.标识文件的索引节点号
6.文件的拥有者UID
7.组ID
8.时间戳,索引节点的改变时间、最后访问时间、最后修改时间
9.访问权限和文件模式
访问权限和文件模式
- 文件潜在用户分为三种:文件所有者的用户,同组用户(不包括所有者),其他
- 访问权限分为三种:读、写和执行
- 所以有九种不同的二进制组合形式的访问权限的表示
还有三种附加的标记:suid (获得文件拥有者的UID),sgid(获得文件用户组的ID) ,sticky(过时了,程序结束,请求保留在内存,现在用基于代码页的共享的其他方法)
当文件由一个进程创建时,文件拥有者的ID就是该进程的UID,而其用户组的ID可以是进程创建者的ID,也可以是父目录的ID,取决于父目录的sgid的值
文件操作的系统调用
- 每个实际的文件操作必须在内核态下进行
打开文件
- 进程只能访问打开的文件。
- 打开一个文件调用系统调用:fd=open(path,flag,mode)
- path相对或者绝对路径
- flag打开方式(读、写、读/写、追加)也指定是否应该创建一个不存在的文件
- mode访问权限
- 返回一个文件描述符fd
一个打开的文件对象包括:
- 文件操作的一些数据结构;offset字段;文件指针等
- 进程可以调用的一些内核函数指针,flag决定
-。。。
文件描述符表示进程与打开文件之间的交互,一个文件打开对象可以有多个同一进程的多个文件描述符
- 几个进程也可以同时打开同一个文件
- 一般不提供同步机制
- 有几个系统调用,如flock()可以
- 也可以用created()系统调用,与open差不多
访问文件
- 普通文件顺序或者随机访问
- 设备文件和命名管道文件只能顺序访问
- read()和Write()总是从文件指针的当前位置读写
- lseek()可以修改文件指针值
- newoffset=lseek(fd,offset,whence)
- fd文件描述符
- offset制定一个符号整数值,用来计算文件指针的新位置
- 指定文件指针新位置的计算方式,从头移动、当前位置、末尾。
- nread=read(fd,buf,count)
- fd
- buf缓冲区地址
- 所读字节数
-write()一样
关闭文件
- close(fp)
更名或者删除文件
- rename(oldpath,newpath)
- unlink(pathname)