目录
一、C语言文件操作回顾
首先编写这样一段C语言代码,对文件进行读操作
#include <stdio.h>
int main()
{
FILE* fp;
fp = fopen("test.txt", "r");
if (fp == NULL)
{
exit(1);
}
while (!feof(fp)) //读文件
printf("%c", fgetc(fp));
fclose(fp);
return 0;
}
对上述代码进行分析来看,C语言文件操作可分为以下三步
- 首先定义一个文件指针,并通过fopen函数获取文件信息,并判断是否打开。
- 而后通过文件指针对文件进行操作。
- 在最后关闭文件。
我们发现,C语言中文件操作依赖于文件指针,其给出了文件操作所需的信息。
而Linux中的文件操作方式与此类似,但不同的是,其依赖于文件描述符。
二、文件描述符
文件描述符(file descriptor)就是内核为了高效管理这些已经被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符来实现。同时还规定系统刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。
Linux对每个打开的文件都有一个文件描述符表格,其记录了文件指针及其对应的文件描述符,简单来说就是存在一个文件指针数组,其数组下标代表了对应文件操作的文件描述符。
文件指针指向该文件对应的文件表,记录文件的使用信息。
文件表中还存在一个i_node的指针,指向真实的文件信息。
如下图所示:
而当我们打开一个新的文件时,会在文件描述符表后新增文件指针及其对应的文件描述符。
例如打开一个test.txt时,表中会在文件描述符为3的位置新增指向test.txt的文件指针。
三、Linux文件操作有关的系统调用
1.打开文件操作
函数介绍
int open(const char* pathname, int flags);//用于打开一个已存在的文件
int open(const char* pathname, int flags,mode_t mode);//用于新建一个文件,并设置访问权限
参数介绍
参数介绍:
pathname:将要打开的文件路径和名称
flags : 打开标志,如 O_WRONLY 只写打开
O_RDONLY 只读打开
O_RDWR 读写方式打开
O_CREAT 文件不存在则创建
O_APPEND 文件末尾追加
O_TRUNC 清空文件,重新写入
mode: 权限 如:“0600”
返回值: 为文件描述符
2.读文件操作
函数介绍
ssize_t read(int fd, void* buf, size_t count);
参数介绍
fd: 对应打开的文件描述符
buf : 存放数据的空间
count: 计划一次从文件中读多少字节数据
返回值:为实际读到的字节数
3.写文件操作
函数介绍
ssize_t write(int fd, const void* buf,size_t count);
参数介绍
fd: 对应打开的文件描述符
buf: 存放待写入的数据
count: 计划一次向文件中写多少数据
文件关闭操作
函数介绍
int close(int fd);
参数介绍
fd: 要关闭的文件描述符
四、写一段程序对普通文件进行拷贝
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>
int main()
{
int rfd = open("passwd", O_RDONLY);
int wfd = open("newfile", O_WRONLY | O_CREAT, 0600);
if (rfd == -1 || wfd == -1)
{
exit(0);
}
char buff[128] = {0};
int num = 0;
while ((num = read(rfd, buff, 127)) > 0)
{
write(wfd, buff, num);
}
close(rfd);
close(wfd);
exit(0);
}