一、linux管理文件
1、硬盘中的静态文件和inode(i节点)
1)静态文件
:放在硬盘中,固定的形式。
2)硬盘的两大区域:
(1)硬盘内容管理表项
和储存内容区域
(2)操作系统先去访问硬盘内容管理表项->扇区级别的信息->得到储存内容区域。
3)操作系统最初拿到的是文件名,最终拿到文件内容
(1)查询硬盘内容管理表(以文件为单位记录各个文件的信息)
(2)每个文件一个信息列表,即为inode
(3)这个结构体记录了{文件名、扇区号、块号…}
(4)u盘的格式化:快速格式化和普通格式化的区别:快速格式化只删除U盘的内容管理表(inode),而普通格式化则完全删除
2、内存中被打开文件和vnode(v节点)
1)每个进程都有一个数据结构来记录进程的所有信息(进程信息表)
2)表中的指针指向文件管理表(记录进程打开的所有文件和相关信息)
3)文件管理表:索引打开文件的index就是文件描述符fd—>找到管理结构体vnode
4)vnode记录了被打开文件的各种信息,即fd->vnode
3、文件流
1)文件中N多的个字符被挨个一次读出/写入时,这些字符就构成了一个字符流
2)流这个概念是动态的
3)编程中提到流这个概念,一般都是IO相关的,经常叫IO流。文件操作时就构成了一个IO流。
二、lseek
1、文件指针
1)打开的文件后读写的文件都是动态文件(内存),其形式是文件流形式。
2)GUI模式下光标来标识正在操作的位置。
3)文件指针是文件管理表的一个指针,即vnode中的一个元素,表示我们当前操作的文件流的位置。linux系统用lseek函数来访问这个文件指针。
4)我们打开空文件,默认文件指针指向文件流的开始。(先write,文件指针已经在结尾、再read就是空的)
2、lseek
函数原型:
off_t lseek(int fd, off_t offset, int whence);
whence:
as follows |
description |
SEEK_SET |
偏移量设置为offset字节 |
SEEK_CUR |
偏移量设置为当前位置加上offset字节 |
SEEK_END |
偏移量设置为文件末尾加上偏移字节大小 |
返回值:
lseek()返回的结果是从文件开头的字节偏移位置。返回-1并设置errno以指示错误。
1)用lseek计算文件长度
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int cal_len(const char * pathname)
{
int fd = -1, ret = -1;
fd = open(pathname, O_RDONLY);
if (-1 == fd)
{
perror("文件打开错误");
return -1;
}
// 使用文件指针移动到末尾,返回值为开头到结尾的偏移
ret = lseek(fd, 0, SEEK_END);
return ret;
}
int main(int argc, char *argv[])
{
int fd = -1, ret = -1;
if (argc != 2)
{
_exit(-1);
}
ret = cal_len(argv[1]);
printf("长度:%d\n", ret);
}
2)构建空洞文件
(1)空洞文件是文件一段是空的。(打开文件用lseek跳过一段,再写就是空洞文件了)
(2)空洞文件方法对多线程共同操作文件是及其有用的,创建大文件,将文件分为多段,每个线程负责一段写入。
注:笔记整理,参考于朱有鹏老师的嵌入式核心课程
被抛弃的写随笔公众号改写技术文章了,感兴趣的可以关注公众号:王崇卫