标准C库IO函数与Linux系统IO函数
文件输入输出站在内存的角度:输入是文件→内存,输出是内存→文件
标准C库IO函数
FILE *fopen(const char *filename, const char *mode)
![](https://i-blog.csdnimg.cn/blog_migrate/57212ff0e41a14c07726bf68e971e15b.jpeg)
返回值(FILE * fp):
文件描述符(文件指针),索引到对应的磁盘文件
文件读写指针位置:在文件内部有一个位置指针,用来指向当前读写到的位置,也就是读写到第几个字节。在文件打开时,该指针总是指向文件的第一个字节。
注意:这个文件内部的位置指针与C语言中的指针不是一回事。位置指针仅仅是一个标志,表示文件读写到的位置,也就是读写到第几个字节,它不表示地址。文件每读写一次,位置指针就会移动一次,它不需要你在程序中定义和赋值,而是由系统自动设置,对用户是隐藏的。
I/O缓冲区(内存地址):通过寻址找到对应的内存块并将数据从内存刷新到磁盘
刷新方法:
刷新缓冲区:fflush
缓冲区已满(默认Buffer 8192byte)
正常关闭文件:a.fclose b.return(main函数) c.exit(main函数)
![](https://i-blog.csdnimg.cn/blog_migrate/ca482811488d58ff01fe10db1e4f7e3b.png)
直接调用标准C库的I/O会有缓冲区存在,在系统内部传递文件时效率高(可以减少系统I/O执行次数)
在网络传输时选用系统I/O可以提高网络通信效率(及时发送文件)
![](https://i-blog.csdnimg.cn/blog_migrate/8ea60fb6ae7403caf9fc7a799f0f1138.png)
虚拟地址空间
![](https://i-blog.csdnimg.cn/blog_migrate/ce3fe5941913ea712fc6a0652dbbb7d1.jpeg)
32位计算机的虚拟地址空间是2的32次方,大约4G
64位计算机的虚拟地址空间是2的48次方
虚拟地址空间会被CPU中的MMU映射到真实的物理内存上
用户区的受保护的地址:例如NULL
堆空间从低地址向高地址存储,栈空间从高地址向低地址存储
内核区无法直接操作,需要调用Linux系统的API,我们可以通过Linux系统的某些API函数来完成需求
程序文件仅仅占用磁盘空间,程序执行起来才会占用内存空间
文件描述符
![](https://i-blog.csdnimg.cn/blog_migrate/8a6a5555f84fe4e4ff48ba1d7d182c32.jpeg)
PCB就是一个复杂的结构体,文件描述符表是一个数组,比如一个应用程序需要控制10个文件的读写,要对应有10个文件描述符组成一个数组,也就是文件描述符表,大小默认是1024,一个进程最大可以打开文件的个数就是1024个
标准输出,标准输入,标准错误是指向当前终端的设备文件,在Linux系统中,万物皆为文件
多次使用fopen打开同一个文件,FILE*中的文件描述符不是一个,当调用fclose后文件描述符才会被释放
文件描述符从小到大寻找
Linux系统IO函数
open
![](https://i-blog.csdnimg.cn/blog_migrate/fc27ff91a6c0ca295bc913cd9b4e7123.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c1810c4350c38275584d265a2c1fb6e1.png)
create
![](https://i-blog.csdnimg.cn/blog_migrate/baef558bafd9505bdbce04ed868d1634.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f652a3e37201ba0739960d01d4ee101d.png)
read write
![](https://i-blog.csdnimg.cn/blog_migrate/10d1a4a69a1b144d7ba4fdc8a92dd053.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bda5bf2984c86e2ef3740ac008d8300a.png)
lseek
![](https://i-blog.csdnimg.cn/blog_migrate/5102ef17af2ec94dc3f30b105b733308.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6184048b64ec13e01523bad173e753f0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/47b147cb1b92d40fde86d620275652e3.png)
stat
![](https://i-blog.csdnimg.cn/blog_migrate/221e6d4dde487bff1bb7a2a909466a4c.png)