UNIX IO小结

来源:互联网 发布:nginx 入门指南 pdf 编辑:程序博客网 时间:2024/06/03 00:34

UNIX 文件IO

1.引言:

   UNIX 文件I/O是不带缓冲的I/O。

   术语不带缓冲是指每个read和write都调用内核中的一个系统调用。不过虽然UNIX I/O函数没有提供缓冲机制,但操作系统的对磁盘文件的访问都有缓冲机制。

   经常用到的I/O操作有:打开(或创建)、写、读、读和写、设置文件偏移量和关闭文件。

   当涉及到多进程的时候,也会有文件共享的问题。


2.文件描述符

    当打开或创建一个文件时,内核想进程返回一个文件描述符(非负整数),文件I/O函数通过这个文件描述符来操作文件。内核也把文件描述符记录为对一个文件的引用。所以文件描述符是一个进程对一个已打开文件的标识和访问媒介。

2.1标准输入、标准输出和标准出错

    每当运行一个程序时,shell都会为其打开三个文件描述符:标准输入、标准输出和错误输出。默认情况下这三个描述符都关联到终端。可以将其重定向到指定文件。

    这三个描述符的取值一般为0、1、2。在程序中我们应该用符号常量STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。这些常量定义在<unistd.h>头文件中。


3.常用的文件I/O函数

open打开或创建一个文件。可以指定各种参数来表示访问方式。

read和write可以一次读写指定的字节数。read的返回值是实际独到的字节数。

lseek用来设置文件偏移量。

close关闭文件。


4.文件共享

    多个线程或进程对同一文件操作就会有文件共享的问题。比如两个进程同时对一个文件写操作,会不会一个进程写的内容把另一个进程写的内容覆盖呢?内核管理文件的方法和文件共享的方式紧密联系。

4.1内核用于管理打开文件的三种数据结构。

     (1)内核负责在进程表中为为每个进程维护一个打开文件描述符表,可以视其为一个矢量表没个文件描述符占用一项。与每个文件描述符相关联的是:

          (a)文件描述符标志(close_on_exec)。(记住它不是文件描述符)

          (b)指向一个文件表项的指针。

      (2)内核为所有打开文件维持一张文件表。每个文件表项包含:

           (a)文件状态标志(读、写、追加写、同步和非阻塞等)。

           (b)当前文件偏移量。

           (c)指向该文件v节点表项的指针。

       (3)(v节点表)每个打开文件(或设备)都有一个v节点结构。v节点包含文件类型和对此文件进行各种操作的函数的指针。对于大多数文件,v节点还包含了该文件的i节点。这些信息是在打开文件时从磁盘上读入内存的,所以所以关于文件的信息都是可供快速使用的。例如,i节点包含了文件的所有者、文件长度、文件所在的设备、指向文件实际数据块在磁盘上所有位置的指针等等。

        下图显示了三张表之间的关系。可以看出文件描述符就是文件描述符表的偏移量(也可以形象的理解为下标)

             

             下图为两个不通进程同时打开同一文件的情况:

             

            从上图可以看出两个进程两个文件描述符有不同的文件描述符标志、不同的文件状态标志、不同的文件偏移量,但指向相同的v节点表。







原创粉丝点击