open, read, write, lseek,close属于系统调用接口。
1.open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
参数:
pathname:要打开的文件名
flags:打开方式:
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR: 读写打开。
这三种打开方式只能使用任意的一个,而且为必选项。
此外还可搭配使用的打开方式:(用 | 符号链接)
O_APPEND: 以追加的方式打开文件
O_CREAT 创建一个文件,注意带O_CREAT参数的需要加上**第三个参数创建权限 mode**,常用:0664
O_EXCL如果使用了O_CREAT而且文件已经存在,就会发生一个错误
O_NOBLOCK 以非阻塞的方式打开一个文件
O_TRUNC 如果文件已经存在,则删除文件的内容
eg: w+ 权限就相当于: O_RDWR | O_TRUNC | O_CREAT
mode:创建权限, eg:0664;
返回值:成功返回非负整数,即文件描述符。失败返回-1.
2.read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
参数
fd:文件描述符,标识要读取的文件。如果为0,则从标准输入读数据。类似于scanf()的功能。
文件描述符:系统调用IO接口的操作句柄,为一个整数,在系统中唯一标识文件。程序启动默认会打开的三个文件描述符:
0:标准输入
1:标准输出
2:标准错误
*buf:缓冲区,用来存储读入的数据。
count:要读取文件的长度。
返回值ssize_t:成功则返回实际读到的数据长度,失败-1.
3.write
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
参数:
fd:open返回的操作句柄(文件描述符)。
*buf:要写入的文件数据。
count:要写入文件长度。
返回值size_t: 成功返回实际写入文件的数据长度。失败-1;
4.lseek
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
fd:是打开的文件描述符,
offset:偏移量,
whence:相对起始位置
SEEK_SET 文件开始,
SEEK_CUR 文件当前前位置
SEEK_END 文件结尾
返回值:成功返回跳转后相对于文件起始处的偏移量,若跳转到文件末尾则可获得文件长度信息。失败 -1;
5.close
#include <unistd.h>
int close(int fd);
功能是关闭文件描述符并释放其对应的内核资源。
成功返回0,出错返回-1
最后有一个简单练习题回顾知识点使用:
要求:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int fd = open("./bite.txt",O_RDWR|O_CREAT,0664);
if(fd < 0){
perror("open error");
return -1;
}
char* str = "i like linux!";
int ret = write(fd,str,strlen(str)) ;
if(ret<0){
perror("write error");
return -1;
}
lseek(fd,0,SEEK_SET);
char buf[1024]={0};
int ret1 = read(fd,buf,1023);
if(ret1 <0){
perror("read error");
return -1;
}
printf("%s\n",buf);
close(fd);
return 0;
}