标准库io接口:fopen close fwrite fread fseak
r:
r+
w
w+
a
a+
stdout stdin stderr 类型: FILE* 文件流指针
注意:文件中包含任意数据处理时要小心,使用完之后要使用fclose关闭避免资源泄露
标准库io接口的操作句柄是FILE*结构体是文件流指针
系统调用接口
open write read close lseek
int open(const char* pathname , int flags, mode_t mode);
pathname:文件路径
flags:选项标志
必选项:
O_RDONLY
O_WRONLY
O_RDWR
可选项:
O_CREAT
O_EXCL
O_TRUNC
O_APPEND
mode:创建文件时给定权限(八进制)
mode&(umask)
返回值创建成功返回文件描述符一个数字,失败返回-1
write:
ssize_t write(int fd,const void* buf,size_t count)
fd:文件描述符
buf:向文件写入数据
count:要写入的数据的长度
返回值:实际写入数据的长度,错误-1
文件描述符文件流指针
标准库函数使用文件流指针 FILE
系统调用接口使用文件描述符: int
库函数系统调用接口:上下级关系
fwrite(“hello”,fd)—>write(“hello,fd”)
文件流指针结构体中就包含了文件描述符,当使用标准库函数进行io操作时则通过文件流指针找到文件描述符
进行操作
printf函数打印数据时,如果没有刷新缓冲区,数据不会直接写入文件而是先写入缓冲区
内核态:功能需要操作系统完成
用户态:用户自己就可以处理
文件描述符:数组下标,进程每打开一个文件都会使用struct file描述这个文件,并将信息添加到pcbstruct file结构中,并且存放到struct file数组中,返回数组下标作为文件描述符用户通过文件描述符对文件进行操作,在内核实际上通过文件描述符找到文件描述信息,进而操作文件
文件描述符分配规则:
最小未使用:
重定向 int dup2(int oldfd , int newfd)如果newfd已有打开文件则关闭它
文件系统:
Linux:ext2
文件存储流程:通过iNode_bitmap在iNode table找到空闲的iNode结点,通过data_bitmap在数据块区域找到空闲的数据块,将数据块信息记录到iNode结点中,将数据写入数据块,将文件名和iNode节点号写到父目录文件中
cat ./a.txt 流程:在当先目录文件中查找文件名信息,通过文件名获得iNode结点号,通过iNode结点号找到iNode结点,进而访问数据块读取数据进行打印
软连接和硬连接
创建硬链接 ln
创建软连接文件 ln -s
软连接是一个独立的文件,iNode结点不同
硬链接是源文件的另一个名字,iNode结点相同
删除源文件,软连接失效硬链接无影响
软连接 可以跨分区建立
静态库/动态库:生成/使用