文件管理的理解

文件=属性+内容
stdin(fd = 0)
stdout(fd = 1)
stderr(fd = 2)
open:打开文件
接口介绍
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
参数:mode 指的是设置文件访问权限
int creat(const char *pathname, mode_t mode);
常用的接口是 int open(const char *pathname, int flags);
O_RDONLY:只读打开
O_WRONLY:只写打开
O_RDWR:读,写打开
O_CREAT:若文件不存在,则创建它,同时需要mode,来指明新文件的访问权限
O_APPEND:追加写
成功则返回新打开的文件的描述符
文件描述符fd
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

文件重定向
在这里插入图片描述
dup2系统调用实现重定向
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
缓冲区:C库函数写入文件时是全缓冲的,而写入显示器是行缓冲
printf,fprintf库函数自带缓冲区,而write系统调用没有带缓冲区
这里所说的缓冲区使用户级缓冲区。这个缓冲区是由C标准库提供的

FILE结构体里包含文件描述符和缓冲区
/usr/include/libio.h

	![在这里插入图片描述](https://img-blog.csdnimg.cn/3e5edf2c55cd428b8360d241f40bfaee.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YCa5b-D,size_20,color_FFFFFF,t_70,g_se,x_16)

在这里插入图片描述
动态库和静态库
静态链接:将对应的代码拷贝进bin,体积比较大,bin可移植性强
链接的时候纳入进来,可能比较占资源(内存资源,硬盘资源)
动态库:生成的程序体积较小,依赖库,运行的时候才加载进来,系统只有一份。
静态库:程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
动态库:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码
生成静态库

ar -rc libmymath.a add.o sub.o

查看静态库中的目录列表

ar -tv libmymath.a

生成可执行程序

gcc -o $@ $^ -I$(path)/mylib1/include -L$(path)/mylib1/lib -lmymath1 -static

-I指定头文件路径
-L指定库路径
-l指定库名

生成动态库
gcc -shared -o $@ $^(打包生成动态库)
gcc -fPIC -c add.c add.o
使用动态库链接文件生成可执行程序

gcc -o $@ $^ -I$(path)/mylib1/include -L$(path)/mylib1/lib -lmymath1

设置环境变量LD_LIBRARY_PATH,为操作系统指明库文件的路径

export LD_LIBRARY_PATH=/home/yqx/code/动静态库/math/mylib1/lib

在这里插入图片描述

在这里插入图片描述
文件系统
文件是存储在硬盘上的,硬盘的最小存储单位叫做扇区sector,每个扇区存储512字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块block。**这种由多个扇区组成的块,是文件存取的最小单位。**块的大小,最常见的是4KB,即连续八个sector组成一个block。

文件数据存储在块中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做inode,中文译名为索引节点,也叫i节点。因此,一个文件必须占用一个inode,但至少占用一个block。

(1).inode的内容
1)inode包含文件的元信息,具体来说有以下内容:
文件的字节数
文件拥有者的User ID
文件的Group ID
文件的读、写、执行权限
文件的时间戳,共有三个:ctime指inode上次文件属性变动的时间,例如:chmod +x a.sh;mtime指文件内容上次变动的时间,例如:echo aa >> a.sh或vim a.sh;atime值文件上次打开的时间,例如:cat a.sh。
链接数,即有多少文件名指向这个inode
文件数据block的位置
2)我们可以用stat命令,查看某个文件的inode信息:
在这里插入图片描述
Access:最后访问时间
Modify:文件内容最后修改时间
Change:属性最后修改时间
在这里插入图片描述
Block
Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。
超级块(Super Block)存放文件系统本身的结构信息。记录的信息主要有:block和inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构被破坏了
GDT ,Group Descriptor Table:块组描述符,描述块组属性信息
块位图(Block Bitmap):Block Bitmap中记录着Data Block哪个数据块已经被占用,哪个数据块没有被占用
inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用,决定了文件的个数。
i节点表:存放文件属性如文件大小,所有者,最近修改时间等
数据区:存放文件内容
目录也是文件-》》文件目录=inode +数据块(文件inode id 和文件名的映射关系)

软硬链接
软链接:具有独立的inode,是一个独立的文件(保存文件的路径)
ln- s (想要被链接的文件名) (生成软链接的文件名)
硬链接:和指向的文件共享同一个inode,不是一个独立的文件
ln (想要被链接的文件名) (生成链接的文件名)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倚心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值