Linux下的open、read、write函数的简单介绍
记录Linux下的open、read、write函数的参数以及简单使用
open函数
首先在Linux下,使用命令man 2 open
打开说明文档,可以看到open函数的头文件以及函数参数信息:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//第一个open函数只能打开一个已经存在的文件
`int open(const char *pathname, int flags);`
参数:
-pathname:要打开文件的路径
-flags:对文件的操作权限设置以及其他设置,其参数可以包括为:O_RDONLY, O_WRONLY, or O_RDWR,并且这三个参数是互斥的,也就是一次只能选用一个。
返回值:
返回一个int类型的文件操作符,如果失败返回-1
函数perror(使用man 3 perror查看文档):
#include <stdio.h>
void perror(const char *s);
作用:打印error对应的错误信息
参数s:用户描述
下面是两个参数的open函数使用案例:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(){
int fd = open("./test.txt",O_RDONLY);
if(fd == -1)
perror("open");
close(fd);
return 0;
}
perror函数返回:open: No such file or directory
//创建一个文件
`int open(const char *pathname, int flags, mode_t mode);`
参数:
- pathname:想要创建文件的路径
- flags:对文件的操作权限和其他设置
- 必选项:O_RDONLY, O_WRONLY, or O_RDWR 这三个之间是互斥的
- 可选项:O_CREAT 若文件不存在,则创建该文件
- mode:八进制的数,设置创建出的新文件的权限
下面是三个参数open函数的一个简单案例:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(){
int fd = open("./test.txt",O_RDONLY | O_CREAT,0777);
if(fd == -1)
perror("open");
close(fd);
return 0;
}
执行和返回结果如下图:
创建出一个test.txt文件。
read函数
首先在Linux下,使用命令man 2 read
打开说明文档,可以看到read函数的头文件以及函数参数信息:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
参数:
- fd:文件描述符,通过open得到的文件描述符来操作文件
- buf:需要读取数据存放的地方,数组的地址
- count:指定数组的大小
返回值:
- 成功:
>0:返回实际读取到的字节数
=0:读取到文件尾
- 失败:-1,并设置error,可用perror函数查看
首先在Linux下,使用命令man 2 write
打开说明文档,可以看到write函数的头文件以及函数参数信息:
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
参数:
- fd:文件描述符,通过open得到的文件描述符来操作文件
- buf:要往磁盘写入的数据
- count:要写数据的指定的大小
返回值:
- 成功:实际写入的字节数
- 失败:返回-1,并设置error
下面为read和write函数的案例:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(){
int fd = open("./poem.txt",O_RDONLY);
if(fd == -1){
perror("open");
return -1;
}
int fdn = open("./cpy.txt",O_WRONLY | O_CREAT,0664);
if(fdn == -1){
perror("open");
return -1;
}
//写操作
char buff[1024] = {0};
int len = 0;
while((len = read(fd,buff,sizeof(buff))) > 0)
write(fdn,buff,len);
close(fdn);
close(fd);
return 0;
}
运行结果会把poem.txt文件里的内容copy到cpy.txt文件里:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理