文章目录
(一)库函数、系统调用
库函数:在函数库实现中、在用户空间调用执行
(1)C语言文件操作库函数
FILE* fopen(const char* pathname, const char* mode); // mode "r"
int fread(void* buff, size_t size, size_t count, FILE* fp);
fwrite(void* buff, size_t size, size_t count, FILE* fp);
fseek(FILE* fp, int offset, int whence); //移动读写游标
// whence : SEEK_SET SEEK_CUR SEEK_END
fclose(FILE* fp);
(2)Linux系统调用
在系统内核中实现,用户空间调用,内核空间执行
1.int open(const char* pathname, int flag);
int open(const char *pathname, int flags, mode_t mode);
参数详解:
- pathname:路径文件名
- flags:打开方式 O_RDONLY(只读)O_WRONLY(只写)O_RDWR(读写)O_APPEND(文本尾部追加打开) O_TRUNC(pathname文件存在,清空该文件,没有则创建)
- O_CREAT: 若此文件不存在则创建它。使用此选项时需要提供第三个参数mode ,表示该文件
的访问权限。- 返回值
失败-1,并设置全局erron
成功返回文件描述符
2.int read(int fd, void* buff, size_t size);
参数详解:
- fd:打开的文件描述符
- buff:保存数据的buff缓冲区的首地址
- size:一次读取的最大字节数(sizeof(buff) - 1)
- 返回值:
失败 -1
读取到的字节个数
3.int write(int fd, void* buff, size_t size);
- fd:文件描述符
- buff:写入文件的缓冲区的首地址
- size:buff中的真实数据大小
- 返回值:
失败 -1
成功:写入的字节个数
4.lseek(int fd, int offset, int whence);
- fd:文件描述符
- offset:标志偏移量
- whence: SEEK_SET SEEK_CUR SEEK_END
- 返回值:
成功:将结果偏移位置返回为从文件开头开始以字节为单位测量
失败 -1 errno被设置为指示错误
5.int close(int fd);
关闭文件描述符
(二)用户态和内核态相关知识
(三)系统调用的使用测试
从键盘获取,保存在mydata.txt文件中
#include <stdio.h> //标准输入输出文件
#include <fcntl.h> //系统调用头文件
#include <unistd.h>
#include <string.h>
void KeyIntoFile()
{
int fd = open("mydata.txt", O_WRONLY |O_CREAT | O_TRUNC, 0664);
if(fd == -1)
return;
printf("input data:\n");
while(1)
{
char buff[128] = {
0};
fgets(buff, 127, stdin);
if(strncmp(buff, "end", 3) == 0)
{
break;
}
write(fd, buff, strlen(buff));
}
close(fd);
printf("saved\n");
}
int main()
{
KeyIntoFile();
return 0;
}
测试结果:
(四)实现cat的显示文件内容的功能
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
void Mycat(int argc, char* argv[])
{
if(argc != 2)
{
perror("argc error"