深入理解linux中的文件(上)
1.前置知识:
(1)文章 = 内容 + 属性
(2)访问文件之前,都必须打开它(打开文件,等价于把文件加载到内存中)
如果不打开文件,文件就在磁盘中
(3)谁会去访问一个文件,进程。进程被加载启动之后,运行到fopen,才会打开一个文件
2.C语言fopen函数:
#include <stdio.h> FILE *fopen(const char *path, const char *mode);
path
: 指向你想要打开的文件路径的字符串。mode
: 字符串,指定文件的打开模式。打开模式
mode
参数决定了文件是如何被打开的。常见的模式有:
"r"
: 只读方式打开文本文件。文件必须存在。"w"
: 只写方式打开文本文件。如果文件存在则将其截断为零长度;如果文件不存在,则创建新文件。"a"
: 追加方式打开文本文件。如果文件存在,则在文件末尾添加数据;如果文件不存在,则创建新文件。"rb"
,"wb"
,"ab"
: 分别对应上面的二进制文件版本。"r+"
,"w+"
,"a+"
: 对应的读写版本(既可读也可写)。"rb+"
,"wb+"
,"ab+"
: 读写模式下的二进制文件版本。
3.系统级接口open:
open系统级接口,我们熟知的fopen是C语言的语言级接口,fopen底层封装的就是open
#include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);
pathname
: 指向你想要打开或创建的文件路径的字符串。flags
: 这个参数可以包含多个标志的按位或组合,用于指定文件的打开方式(例如:只读、只写、读写等)。mode
: 当创建新文件时(通过使用了O_CREAT
标志),这个参数指定了新文件的权限模式。常见标志
O_RDONLY
: 只读方式打开文件。O_WRONLY
: 只写方式打开文件。O_RDWR
: 读写方式打开文件。O_CREAT
: 如果指定的文件不存在,则创建之。O_TRUNC
: 如果文件存在并且以写方式或者读写方式打开,则将其长度截断为0。O_APPEND
: 每次写操作前都会将文件指针移动到文件末尾。返回值
成功时,
open
函数返回一个新的文件描述符;失败时返回-1
并设置errno
来指示错误类型。
4.文件描述符(open函数的返回值)
操作系统中,只认识 “文件描述符” :<0,代表打开文件失败
0 1 2 分别代表 键盘文件(标准输入)显示器文件(标准输出)显示器文件(标准错误流)
接下来打开的文件顺序是从3号开始
每一个进程,都可以打开多个文件,都有这样子的一个数组,用于存储各种的struct file
当进程打开文件成功之后,就会把数组的下标作为返回值fd1,放回给进程。
C语言对操作系统中的文件操作进行了两个封装:
1.接口封装 fopen(C语言级接口) -> open(系统级接口)
2.类型封装 FILE (结构体,里面肯定包含文件描述符)-> int (文件描述符,下标)