文件I/O、文件和目录学习总结

  学习了apue的文件I/O和文件与目录两章,对于Unix的文件系统有了新的认识。记录如下。

一. 文件I/O

  1. 对于内核而言,每个打开的文件都通过文件描述符fd来引用,fd是一个整数。read、write等函数都以fd来确定目标文件。
  2. 每个文件都有一个“偏移量”来作为所有读写操作的起始点。偏移量是从文件开始处到偏移位置的字节数。可以通过lseek函数来设置修改打开文件的偏移量。
  3. 内核使用3种数据结构表示打开的文件
      1.每个进程在进程表中都有一个记录项,该记录项中包含一张打开文件描述符表,每个描述符占用表中一项。与每个文件描述符相关联的是:文件描述符标志和指向一个文件表项的指针 。
      2.内核为所有打开文件维持一张==文件表==。每个文件表项包含文件状态标识、当前文件偏移量、指向该文件v节点表项的指针。
      3.每个打开文件都有一个v节点结构,其包含了文件类型和对此文件进行各种操作函数的指针。大多数文件的v节点还包含了i节点,用来存储文件的文件类型、文件权限、文件的数据块指针等信息。
     这三种数据结构的关系如下所示:
     文件I/O、文件和目录学习总结_第1张图片
     
  4. 文件共享:如果两个独立进程各自打开了同一个文件,那么这两个进程各自拥有一个该文件的文件表项(因为允许进程对文件拥有自己的当前文件偏移量),但这两个文件表项指向同一个文件v节点。
  5. dup和dup2函数对文件描述符复制,返回一个新的文件描述符,这两个文件描述符共享同一个文件表项。
  6. 函数fcntl用来改变已经打开的文件的属性。

二. 文件和目录

  1. 内核中定义了struct stat这样一个结构体来存放文件的信息,其成员变量包含文件类型权限、i节点号、设备号、文件所有者号、用户组号、最后访问时间、修改时间等。
  2. 函数umask为进程设置文件模式创建屏蔽字,umask的参数就是准备屏蔽的文件权限。

  3. 每个i节点中有一个链接计数,用来记录指向该i节点的目录项数。只有当链接计数减为零时,才可以删除该文件。对于目录文件而言,一个叶目录(不包含任何其他目录的目录)的链接计数总是2,因为命名该目录文件的目录项和该目录中的.目录项会指向该目录文件的i节点。非叶目录的链接计数至少为3,因为还有其子目录文件中的..目录项指向它。

  4. 目录项是一种硬链接,直接指向i节点。

  5. 当前工作目录是进程的一个属性,它是此进程进行一切与目录相关的活动的起点。可以通过chdir函数改变进程的当前工作目录。

你可能感兴趣的:(c,linux内核)