函数 | 描述 |
---|---|
fopen | 打开一个文件 |
fwrite | 向指定文件写入数据 |
fread | 从文件读取数据 |
fseek | 指定当前文件下的光标位置 |
fclose | 关闭一个文件(注意,在文件试用网完毕后要关闭文件,避免造成资源泄漏) |
打开方式 | 描述 |
---|---|
r | 只读方式打开 |
r+ | 读写方式打开,文件不存在则报错,文件存在则清空原有内容 |
w | 只写方式打开 |
w+ | 读写方式打开,文件不存在则创建,文件存在则清空原有内容 |
a | 追加方式打开 |
a+ | 读和追加方式打开,文件不存在则创创建,文件存在则在文件的结尾部分追加写 |
b | 表示二进制文件写入读取追加 |
t | 表示文本文件写入读取追加 |
接口:
#include
#include
int open(const char* pathname, int flags);
int open(const char* pathname, int flags, mode_t mode);
pathname:要打开或创建的文件
flags | 描述 |
---|---|
O_CREAT | 文件不存在则创建 |
O_RDONLY | 只读方式打开 |
O_WRONLY | 只写方式打开 |
O_RDWR | 读写方式打开 |
O_APPEND | 追加方式打开 |
O_EXCL | 搭配O_CREAT使用 |
O_TRUNC |
mode:设置文件的权限设置之前要加上umask(0)来临时置空系统默认权限位
文件描述符:
如图所示,系统对程序的描述是一个task_struct结构体,在结构体中有一个files指针,这个指针指向一个file_struct结构体,在这个结构体中存在fd_array[]数组,这个数组的下标 就是文件描述符fd,通过这个下标,我们可以访问到这个文件。进而对文件进行操作。
文件描述符的分配规则:
文件描述符是按照从前往后找,找到第一个没有被分配的下标做为该文件描述符。
当标准输出的文件描述符被关闭时,本该输出到终端的输出被输出到1号描述符描述的文件中去了,这种现象称之为输出重定向。
常见的重定向有:>> , >, <
printf和fwrite库函数自带缓冲区,而write系统调用接口没有提供缓冲区。
文件描述符和文件流指针的关系:
文件流指针FILE是一个结构体,成员就是文件描述符
库函数封装了系统调用接口,因此,库函数的调用归根结底是系统调用接口的使用
我们通常所说的是缓冲区也就是文件流指针结构体中定义的缓冲区。这个缓冲区通常被称为用户态缓冲区。
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候不需要静态库
动态短库(.so)程序在运行的时候链接动态库中的代码,多个程序共享使用库的代码
动态库链接只链接包含它用到的函数入口地址的一个表
动态库更加节省磁盘空间
//生成汇编代码
gcc -c [.c文件] -o [.o文件]
//静态库打包
ar -cr lib[静态库名称].a [.o文件]
静态库的使用:
生成可执行程序时链接使用:
1、将库文件放在指定路径下 /usr/lib64 /usr/lib
2、设置链接库的搜索路径环境变量 export LIBRARY_PATH=$LIBRARY_PATH:.
3、使用gcc [.c文件] -o [目标文件] -L[path] -l[库名称]
动态库的打包:
//生产汇编代码
gcc -c -fPIC [.c文件] -o [.o文件]
//动态库打包
gcc -shared [.o文件] -o lib[动态库名称].so
-fPIC选项是产生位置无关代码
动态库的命名方式lib***.so
查看动态库的目录列表:
动态库的使用:
运行时可执行程序时加载使用:
1、将库文件放在指定路径下 /usr/lib64 /usr/lib
2、设置链接库的搜索路径环境变量 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
命令:
ls -l
stat [文件名称]
功能:
查看文件列表,查看文件的详细信息
ls -l包含的信息:
1、模式
2、硬链接数
3、文件的所有者
4、文件的所属组
5、文件的最后一次修改时间
6、文件的大小
7、文件名称
stat [文件]包含的信息
文件名称,文件大小,文件的块大小,文件的IO块大小,文件类型
文件的所属设备,文件的Inode节点,文件的硬连接数,文件的权限,文件的所有者id,文件的所属组id文件所处环境
文件的最近修改,最近访问,最近改动时间
Inode:
Inode包含文件的源信息
1、文件的字节数
2、文件的所有者
3、文件的所属组
4、文件的读写执行权限
5、文件的时间戳,ctime Inode的创建时间,mtime文件内容上一次修改时间,atime文件最后一次访问时间
6、文件的链接数
7、文件数据的block位置
目录项:
目录下的文件名和文件的Inode节点号
查找文件的流程:
打开目录文件,读取目录项信息,通过文件名找到文件的Inode节点号->通过Inode节点号找到文件系统在Inode区域中的Inode节点,再通过Inode节点储存的文件数据储存位置,找到文件在数据区域存储的数据
创建一个新文件的操作:
1、储存属性:内核先找一个空闲的节点,把文件信息记录到其中
2、数据储存:将信息分块记录在不同的磁盘块中
3、记录分配情况:内核在Inode的磁盘分布区间记录存放块位置顺序
4、添加文件名称到目录项:内核将入口添加到目录,文件名和Inode之间的对应关系将文件名和文件的内容及书写连接起来。
硬链接:
硬链接就像是文件的别名,它有自己的目录项,但是没有单独的Inode节点和数据区,一个文件每多一个硬链接,它的Inode节点的 链接数就会+1,这个Inode节点对应多个不同名称的文件,可以通过任意一个文件名称访问这个文件,每删除一个文件,该文件的Inode节点的链接数就会-1,当链接数为0的时候,这个文件才被真正的删除。
因此,删除源文件,我们依然可以访问到这个文件,当且仅当这个文件的链接数>0
创建硬链接的方法:
命令:
ln [源文件] [硬链接文件]
功能:
为指定文件创建硬链接
软链接:
软链接是一个独立的文件,有自己的目录项,Inode节点,数据区。可以理解为是源文件的快捷方式(注意,这里提到的快捷方式并不准确,并不是Windows系统下的那个快捷方式)通过软链接文件可以访问到源文件,当源文件被删除时,这个软链接将不再访问到源文件。
命令:
ln -s [源文件] [软链接文件]
功能:
为文件创建软链接
区别项 | 软链接 | 硬链接 |
---|---|---|
是否针对目录 | 可以 | 不可以 |
是否产生新文件 | 是新文件 | 是源文件的别名 |
是否跨分区 | 可以跨分区 | 不可跨分区(每个文件系统都有自己的文件系统的划分的超级快,Inode位图和data位图,以及Inode节点和data数据) |
删除源文件是否可以继续访问 | 不可以访问 | 无影响,除非链接数<0 |