Please enable Javascript to view the contents

Unix 文件

 ·  ☕ 3 分钟

在 Unix 中,一切皆为文件

这句话就好像我们之前听到过的:

在 C 中,一切皆为地址

在 Python 中,一切皆为对象 ……

那么,在Unix中,「文件」到底是什么呢?
在 Unix 中,一个文件就是多个字节构成的序列,我们知道的许多外设:网卡、显卡、磁盘、终端 ...... 都被映射为一个个文件,这些设备的输入和输出都由其相应文件的读和写操作来完成,关于文件,在 CSAPP 中的第十章做出了如下概述:

这种将设备优雅地映射为文件的方式,允许 Linux 内核引出一个简单、低级的应用接口,成为 Unix I/O,这使得所有的输入和输出都能以一种统一且一致的方式来执行:

  • 打开文件:

    • 一个应用程序的进程通过要求内核打开相应的文件,来宣告它想要访问一个 I/O 设备。内核返回一个小的非负整数,叫做:描述符

    • 描述符 在后续对此文件的所有操作中标识这个文件,内核记录有关这个打开文件的所有信息。应用程序只需记住这个描述符。


  • Linux shell 创建的每个进程开始时都有三个打开的文件:

    • 标准输入 STDIN (描述符为0)

    • 标准输出 STDOUT(描述符为1)

    • 标准错误 STDERR(描述符为2)


  • 改变当前的文件位置:

    • 对于每个打开的文件,内核保持着一个文件位置 k , 初始为 0。这个文件位置是从文件开头起始的字节偏移量。

    • 进程能够通过执行 seek 操作,显式地设置文件的当前位置为 k 。


  • 读写文件:

    • 一个读操作就是从文件复制 n (>0) 个字节到内存,从当前文件位置 k 开始,然后将 k 增加到 k+n 。给定一个大小为 m 字节的文件,当 k>=m 时再执行读操作会触发一个称为 end-of-file (EOF)的条件,进行读操作的进程能检测到这个条件。在文件结尾处并没有明确的 EOF 符号。


  • 关闭文件:

    • 当进程完成了对文件的访问之后,它就通知内核关闭这个文件。作为响应,内核将释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。无论一个进程因为何种原因终止时,内核都会关闭所有打开的文件并释放它们的内存资源。



文件类型


每个 Linux 文件都有一个类型 来表明它在系统中的角色

  • 普通文件:包含任意数据对内核而言,无区分;对应用进程而言,有如下区分

    • 文本文件( text file ):只含有 ASCIIUnicode 字符的普通文件;

    • 二进制文件( binary file ):除了文本文件,其他所有文件都是二进制文件。


  • 目录:在 Unix 下,目录也是一种文件类型

    • 目录 是包含一组 链接 link 的文件,其中每个链接都将一个文件名映射到一个文件,这个文件也可能是另一个目录。

    • 每个目录至少含有两个条目:「.」表示到该目录自身的链接,「..」表示到目录层次结构中 父目录 的链接


  • 套接字:套接字是用来与另一个进程进行跨网络通信的文件。


  • 其他文件类型:命名通道、符号链接、字符和块设备。




引用参考


《深入理解计算机系统》 第3版 R.R.Bryant , D R.O’Hallaron 著,龚奕利 贺莲 译