1.文件1.狭义理解⽂件在磁盘⾥磁盘是永久性存储介质因此⽂件在磁盘上的存储是永久性的磁盘是外设即是输出设备也是输⼊设备磁盘上的⽂件 本质是对⽂件的所有操作都是对外设的输⼊和输出 简称 IO2.广义理解Linux 下⼀切皆⽂件3.⽂件操作的归类认知对于 0KB 的空⽂件是占⽤磁盘空间的⽂件是⽂件属性元数据和⽂件内容的集合⽂件 属性元数据 内容所有的⽂件操作本质是⽂件内容操作和⽂件属性操作4.系统角度理解对⽂件的操作本质是进程对⽂件的操作磁盘的管理者是操作系统⽂件的读写本质不是通过 C 语⾔ / C 的库函数来操作的这些库函数只是为⽤⼾提供⽅便⽽是通过⽂件相关的系统调⽤接⼝来实现的2.系统文件I/O2.1 接口介绍open()的作用打开一个文件并返回一个文件描述符int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); pathname: 要打开或创建的⽬标⽂件 flags: 打开⽂件时可以传⼊多个参数选项⽤下⾯的⼀个或者多个常量进⾏“或”运算构成 flags。 参数: O_RDONLY: 只读打开 O_WRONLY: 只写打开 O_RDWR : 读写打开 这三个常量必须指定⼀个且只能指定⼀个 O_CREAT : 若⽂件不存在则创建它。需要使⽤mode选项来指明新⽂件的访问权限 O_APPEND: 追加写 mode 指的是 创建新文件时给这个文件设置的初始权限。 返回值 成功新打开的⽂件描述符 失败-12.2 文件描述符 fdLinux进程默认情况下会有3个缺省打开的⽂件描述符分别是标准输⼊0 标准输出1 标准错误2.0,1,2对应的物理设备⼀般是键盘显⽰器显⽰器⽽现在知道⽂件描述符就是从0开始的⼩整数。当我们打开⽂件时操作系统在内存中要创建相应的数据结构来描述⽬标⽂件。于是就有了file结构体。表⽰⼀个已经打开的⽂件对象。⽽进程执⾏open系统调⽤所以必须让进程和⽂件关联起来。每个进程都有⼀个指针*files, 指向⼀张表files_struct,该表最重要的部分就是包含⼀个指针数组每个元素都是⼀个指向打开⽂件的指针所以本质上⽂件描述符就是该数组的下标。所以只要拿着⽂件描述符就可以找到对应的⽂件。⽂件描述符的分配规则在files_struct数组当中找到当前没有被使⽤的最⼩的⼀个下标作为新的⽂件描述符。2.3 重定向改变输入输出的方向叫做重定向常⻅的重定向有: , , 重定向的本质2.4 dup2dup2()可以理解成把一个文件描述符“复制到指定的编号”上。int dup2(int oldfd, int newfd);让newfd和oldfd指向同一个打开的文件。3.理解 Linux下一切皆文件开发者仅需要使⽤⼀套API和开发⼯具即可调取Linux系统中绝⼤部分的 资源。举个简单的例⼦Linux中⼏乎所有读读⽂件读系统状态读PIPE的操作都可以⽤ read 函数来进⾏⼏乎所有更改更改⽂件更改系统参数写PIPE的操作都可以⽤ write 函 数来进⾏。上图中的外设每个设备都可以有⾃⼰的read、write但⼀定是对应着不同的操作⽅法但通过 struct file 下 file_operation 中的各种函数回调让我们开发者只⽤file便可调取Linux系 统中绝⼤部分的资源这便是“linux下⼀切皆⽂件”的核⼼理解。4.缓冲区4.1 什么是缓冲区缓冲区是内存空间的⼀部分。也就是说在内存空间中预留了⼀定的存储空间这些存储空间⽤来缓 冲输⼊或输出的数据这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输⼊设备还是输出设 备分为输⼊缓冲区和输出缓冲区。4.2 为什么要引⼊缓冲区机制读写⽂件时如果不会开辟对⽂件操作的缓冲区直接通过系统调⽤对磁盘进⾏操作(读、写等)那么 每次对⽂件进⾏⼀次读写操作时都需要使⽤读写系统调⽤来处理此操作即需要执⾏⼀次系统调 ⽤执⾏⼀次系统调⽤将涉及到CPU状态的切换即从⽤⼾空间切换到内核空间实现进程上下⽂的 切换这将损耗⼀定的CPU时间频繁的磁盘访问对程序的执⾏效率造成很⼤的影响。为了减少使⽤系统调⽤的次数提⾼效率我们就可以采⽤缓冲机制。⽐如我们从磁盘⾥取信息可 以在磁盘⽂件进⾏操作时可以⼀次从⽂件中读出⼤量的数据到缓冲区中以后对这部分的访问就不 需要再使⽤系统调⽤了等缓冲区的数据取完后再去磁盘中读取这样就可以减少磁盘的读写次数 再加上计算机对缓冲区的操作⼤ 快于对磁盘的操作故应⽤缓冲区可⼤ 提⾼计算机的运⾏速度。 ⼜⽐如我们使⽤打印机打印⽂档由于打印机的打印速度相对较慢我们先把⽂档输出到打印机相 应的缓冲区打印机再⾃⾏逐步打印这时我们的CPU可以处理别的事情。可以看出缓冲区就是⼀ 块内存区它⽤在输⼊输出设备和CPU之间⽤来缓存数据。它使得低速的输⼊输出设备和⾼速的 CPU能够协调⼯作避免低速的输⼊输出设备占⽤CPU解放出CPU使其能够⾼效率⼯作。4.3 缓冲类型标准I/O提供了3种类型的缓冲区•全缓冲区这种缓冲⽅式要求填满整个缓冲区后才进⾏I/O系统调⽤操作。对于磁盘⽂件的操作通 常使⽤全缓冲的⽅式访问。•⾏缓冲区在⾏缓冲情况下当在输⼊和输出中遇到换⾏符时标准I/O库函数将会执⾏系统调⽤ 操作。当所操作的流涉及⼀个终端时例如标准输⼊和标准输出使⽤⾏缓冲⽅式。因为标准 I/O库每⾏的缓冲区⻓度是固定的所以只要填满了缓冲区即使还没有遇到换⾏符也会执⾏ I/O系统调⽤操作默认⾏缓冲区的⼤⼩为1024。•⽆缓冲区⽆缓冲区是指标准I/O库不对字符进⾏缓存直接调⽤系统调⽤。标准出错流stderr通 常是不带缓冲区的这使得出错信息能够尽快地显⽰出来。除了上述列举的默认刷新⽅式下列特殊情况也会引发缓冲区的刷新1. 缓冲区满时 2. 执⾏flush语句 3. 进程结束