文件描述符
表述打开的文件的
它是open函数的返回值,一个进程启动之后,会默认打开3个文件标识符
0标准输入,1标准输出,2标准错误
新的打开的文件返回文件描述符表中未使用过的最小的文件描述符
open函数
用来打开或者新建一个文件
函数原型
int open(const char *pathname, int flags)
int open(const char *pahtname,int flags,mode_t mode)
pathname–>打开或者新建的文件的路径
flags–>文件的访问模式同时可以选择多个,用’ | '连接
必选:O_RDONLY、O_WRONLY、O_RDWR(三选一)
可选:O_APPEND(偏移量到最后)、O_CREAT(文件不存在创建出来,访问权限,有掩码)、O_EXCL(出错返回)
O_TRUNC(如果文件存在,将其长度阶段为0字节)
返回值:
成功返回未被占用的最小的文件描述符
失败则返回-1
open(“a.txt”,O_RDWR | O_CREAT, 0644)
rwx中的x对于目录而言,是可以进入这个文件
对于文件而言,是表示这个文件是可执行文件
阻塞与非阻塞(O_NONBLOCK)
阻塞发生的前提是有阻塞事件的发生,例如去IO磁盘中的数据,进程会阻塞
但是普通文件读取数据是在内核缓冲区中,不会发生阻塞事件
所以:
普通文件默认是非阻塞的
设备、管道和套接字文件默认是阻塞的
close函数
函数描述
关闭文件的
函数原型
int close(int fd)
返回值
成功返回0
失败返回-1
read函数、write函数
把a中的文件读取到缓冲区里,然后再把缓冲区的内容放a中,放入的内容为追加
但是把a中的文件读取后放b中,放入的内容为覆盖
这是因为一个文件再被读取之后,会改变它的偏移量到最末尾,所以a中的读取后再写a中属于追加
lseek函数
函数原型
off_t lseek(int fd,off_t offset,int whence)
函数参数
offset+SEEK_SET–>设置偏移量为offset
offset+SEEK_CUR–>设置偏移量为当前cur+offset
offset+SEEK_END–>负数(end-)整数(扩容)
返回值
成功返回新的偏移量
失败返回-1
常用
lseek(fd,0,SEEK_SET);
int len=lseek(fd,0,SEEK_CUR);
int len=lseek(fd,0,SEEK_END);
lseek(fd,n,SEEK_END);(扩展后需要执行一次写操作才能操作成功)
面试
1.知道为什么有这个知识点
2.知道知识点的使用场景
3.背一个知识点可以从它的名字开始
系统调用
系统调用是进入内核态的入口,只有在内核态的时候才能管理硬件资源
索引
名字:–>搜索+下标
索引是用来快速查找数据的一种数据结构 (类比字典和目录)
二叉搜索树(不平衡,可以退化成链表O(n)查找)–>平衡二叉树(层数高,磁盘IO读取多)–>B树(多叉树)–>B+树(数据都在叶子结点的多叉平衡树)
事务
交易要么成功要么失败
fcntl函数
用来获取或修改文件访问权限(状态)flags的函数
获取flags(访问权限)
int flags=fcntl(int fd,F_GETFL);
修改flags
fcntl(int fd,F_SETFL,flags)
失败返回-1并且设置errno值
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<fcntl.h>
#include<sys/stat.h>
int main(int argc, char* argv[]){
int fd=open("a.txt",O_RDONLY | O_CREAT |O_NONBLOCK,0644);
int flags=fcntl(fd,F_GETFL);
//保留末2位,因为只读只写 可读可写 没有超过3的数据所以都用&3保留后俩位
if((flags & O_ACCMODE) == O_RDONLY){
printf("文件可读\n");
}
return 0;
}
dup函数
复制文件描述符,返回新的文件描述符,使新的fd和旧的fd指向同一打开的文件
int new_fd=dup(old_fd);
用open打开同一文件两次,fd1和fd2指向的是不同的打开文件
fd2覆盖了fd1的内容,因为fd维护文件偏移量,fd指向不同文件写入不会改变文件偏移量
但是用dup函数复制文件描述符,复制的fd和原fd指向同一打开文件
dup2函数
int new_fd2=dup2(old_fd,new_fd1);
关闭fd1文件,使fd1指向old_fd
perror函数
打印errno值相对应的报错信息
perror(const char *s)
在输出报错信息前加一些额外的信息
strerror函数
将错误码转换为相应信息的错误字符串
stat函数
获取文件的属性
头文件:#include <sys/stat.h>
int stat(const char* pathname,struct stat *file_info)传出参数
int lstat(const char* pathname,struct stat *file_info)
int fstat(int fd,struct *file_info)