学习系统调用接口
文章目录
- 学习系统调用接口
- 一、学习系统调用接口
- 1.open
- 2.write
- 3.read
- 4.lseek
- 5.close
- 二、代码实现
- 1.代开文件
- 2.写入数据
- 3.读取数据
- 4.代码实现
一、学习系统调用接口
1.open
pathname:文件路径名; flags:标志位;
必选其一:O_RDONLY, O_WRONLY,O_RDWR
可选项:O_CREAT:如果文件不存在则创建;
O_EXCL:跟O_CREAT一起使用,如果文件已经存在则报错返回;
O_TRUNC:打开文件时截断文件长度为0–清空内容;
O_APPEND:将写入设置为追加写;
w+:O_RDWR | O_CREAT | O_TRUNC; a+:O_RDWR | O_APPEND | O_CREAT
mode:文件的权限设置,0777–如果使用了O_CREAT就一定要指定mode;
返回值:成功返回非负整数–操作句柄-文件描述符; 失败返回-1;
2.write
fd:open返回的操作句柄,用于明确操作的是哪个文件;
buf:要写入文件的数据; count:要写入文件的数据长度;
返回值:成功返回实际写入文件的数据长度;失败返回-1;
3.read
fd:open返回的操作句柄,用于明确操作的是哪个文件;
buf:存放读取到的数据的缓冲区;
count:要读取的数据长度;
返回值:成功返回实际读取到的数据长度;失败返回-1;
4.lseek
fd:open返回的操作句柄; offset:偏移量;
whence:相对起始偏移位置-SEEK_SET/SEEK_CUR/SEEK_END
返回值:跳转后的位置相对于文件起始位置的偏移量;失败返回-1;
5.close
二、代码实现
1.代开文件
代码如下(示例):
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
int main()
{
//int open(文件名,选项标志,权限)
int fd = open("test.txt", O_RDWR|O_CREAT, 0777);
if(fd < 0){
perror("open error");
return -1;
}
close (fd);
return 0;
}
此时修改权限有两种方法:
1.修改权限掩码,但是此时并不建议直接修改权限掩码,因为修改之后是会一直生效的是对整个系统产生效果的。
2.通过系统调用函数来修改权限
2.写入数据
代码如下(示例):
char *ptr = "昏昏欲睡\n";
//write(句柄,数据,长度)
int ret = write(fd, ptr, strlen(ptr));
if(ret < 0){
perror("write error");
return -1;
}
数据写入成功
追加写
3.读取数据
char buf[1024] = {0};
ret = read(fd, buf, 1023);
if(ret < 0){
perror("read error");
return -1;
}
printf("%d----%s\n", ret, buf);
4.代码实现
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
int main()
{
umask(0);//将当前进程的文件权限掩码设置为0
//int open(文件名,选项标志,权限)
int fd = open("test.txt", O_RDWR|O_CREAT|O_APPEND, 0777);
if(fd < 0){
perror("open error");
return -1;
}
char *ptr = "昏昏欲睡\n";
//write(句柄,数据,长度)
int ret = write(fd, ptr, strlen(ptr));
if(ret < 0){
perror("write error");
return -1;
}
//lseek(句柄,偏移量,相对位置)
lseek(fd, 0, SEEK_SET);
char buf[1024] = {0};
ret = read(fd, buf, 1023);
if(ret < 0){
perror("read error");
return -1;
}
printf("%d----%s\n", ret, buf);
close (fd);
return 0;
}