Linux中的系统IO函数
一. 系统IO函数
1>. 一些概念
文件描述符
PCB
C库函的IO缓冲区
1) 文件描述符
int 类型
一个进程最多可打开多少文件:
2) pcb
进程控制块
在其中有一个文件描述符表 -- 数组[1024]
C库IO函数工作流程:
pcb和文件描述符:
虚拟地址空间就是程序启动起来之后从硬盘上会有一块虚拟内存分配出来。
cpu 为什么要使用虚拟地址空间与物理地址空间映射?解决了什么样的问题?
1.方便编译器和操作系统安排程序的地址分布。
程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。通过虚拟地址空间与物理地址空间映射解决不连续的缓冲区的问题。
2.方便进程之间隔离
不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程使用的物理内存。
3.方便OS使用你那可怜的内存。
程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,
内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。
虚拟地址空间的布局如下:
0-3G是用户空间 3-4G是内核空间
用户区, 内核区
代码段
已经初始化的全局变量
未被初始化的全局变量
堆 -- 从下往上
共享库
栈 - 从上往下
环境变量
内核区
C库函数与系统函数的关系 :
FD:文件描述符 FP_POS:文件指针 BUFFER:缓冲区
write对0-3G的用户空间进行操作 sys_write()对3-4G的内核空间进行操作
2>. open
可以去man文档里进行查看,命令,即表示查看man文档的第二章的open函数
打开方式:
必选项:
O_RDONLY
O_WRONLY
O_RDWR
可选项:
O_CREAT
文件权限: 本地有一个掩码
文件的实际权限:
给定的权限
本地掩码(取反)
&
实际的文件权限
777
111111111
111111101
111111101
775
O_TRUNC
O_EXCL
O_APPEND
open函数中的errno:
3>. read
返回值:
1. -1 读文件失败
2. 0 文件读完了
3. >0 读取的字节数
4>. write
返回值:
5>. lseek
返回值:
6>. close
返回值: