系统文件I/O接口类比C语言文件接口实现,它们的操作流程基本是类似的。但是C文件中的接口fopen、fclose、fwrite、fseek、fread都是C标准库当中的函数,我们称之为库函数。而open、close、write、lseek、read是属于系统提供的接口,称之为系统调用接口。库函数跟系统调用接口是属于上下级的关系即库函数封装了系统调用接口。接下来就让我们认识一下系统调用接口。
- open:打开文件
- int open(const char *pathname, int flags, mode_t mode);
- pathname:指定要打开的文件名称
- flags:选项参数
- mode:使用权限
- 必选参数:
- O_RDONLY O_WRONLY O_RDWR 只能选其一
- O_RDONLY:以只读方式打开
- O_WRONLY :以只写方式打开
- O_RDWR:以读写方式打开文件
- 可选参数:
- O_CREAT:若文件存在则打开:否则创建新文件
- O_EXCL:与O_CREAT同时使用;若文件存在则报错;不存在则创建
- O_TRUNC:打开文件同时截断文件为0长度
- O_APPEND:写数据的时候总是写到文件末尾
- 返回值:文件描述符(正整数) 失败:-1
#include<stdio.h>
#include<fcntl.h>
#include<sys/stat.h>
int main(){
umask(0);//设置掩码为0
int fd = open("./test.txt",O_RDONLY|O_CREAT,0664);//以只读方式打开,文件不存在则创建它
if(fd<0){
perror("open error");
return -1;
}
return 0;
}
- write:在一个文件描述符上执行写操作
- read:从文件描述符 fd 中读取 count 字节的数据并放入从 buf 开始的缓冲区中
- ssize_t read(int fd, void *buf, size_t count);
- 返回值:返回实际读取到的字节数 失败-1
char buf[1024] = {0};
ret = read(fd,buf,1023);
if(ret<0){
perror("read error");
return -1;
}
printf("ret:%d-[%s]\n",ret,buf);
- lseek:跳转fd文件的读写位置到指定处
- off_t lseek(int fd, off_t offset, int whence);
- offset:偏移量
- whence
- SEEK_SET : 文件起始位置
- SEEK_END : 文件末尾位置
- SEEK_CUR : 文件读写位置
lseek(fd,0,SEEK_SET);
- close:关闭一个文件描述符
- int close(int fd);
接下来是整个代码实现
