Linux 文件(1)
1. 文件
1.1 文件是什么
一个文件,是由其文件属性与文件内容构成的。文件属性又称为一个文件的元数据,因此如果一个文件,内容为空,这个文件依然要占据磁盘空间。
1.2 文件在哪里
一个文件,如果没有被打开,那么这个文件就在硬盘上,对于硬盘上的文件,我们使用文件系统进行组织和管理。
一个文件,如果被打开了呢?我们首先要搞明白,文件是如何被打开的。之前,我们在C语言中,使用fopen函数来打开一个文件,即文件打开,本质是通过一个程序实现的。所以,文件的打开依赖于进程,而进程打开文件的实质就是由操作系统将此文件加载到内存中。
所以,一个进程可以打开多个文件.OS内,一定同时存在多个被打开的文件,因此在操作系统中,一定存在一种专门描述文件的结构体,操作系统借助该结构体,对打开的,加载到内存中的文件进行管理。
2. 文件的相关操作
2.1 文件操作的本质
文件是由文件内容与文件属性构成的,因此对文件的操作,本质就是对文件内容和文件属性的操作。
对于文件的操作,无论是读文件,还是写文件,都需要在内存与硬盘之间进行交互,因此一定是由操作系统来实现的。
而我们在C语言中,通过C语言库中封装好的文件操作相关函数实现文件操作,实质上,这些函数底层都是通过相关文件的系统调用实现文件操作的。
2.2 用C语言函数进行文件操作
2.2.1 文件写
2.2.2 文件读
2.2.3 通过文件读和写实现cat命令
Linux命令行中的cat命令,本质上就是获取相应文件内容,并将相关文件内容输出到显示器上,因此我们可以同文件操作的相关接口实现cat命令。
2.3 用系统接口进行文件操作
前面讲过,所有对文件的操作,本质上都是通过系统调用接口完成的。下面,我们直接通过Linux的系统调用接口,来对文件进行操作。
2.3.1 打开文件
open
是用于打开文件的系统接口。
pathname:文件的绝对路径或相对路径。
flags:打开文件时的标志位,即文件以怎样的方式打开(读或写等等)。此处传递标志位的方式很特殊,利用了位操作。
mode:是文件不存在时,创建文件所赋予的权限。
此处,讲一下如何利用位操作便捷传递标志位。
输出结果如下:
言归正传,我们来看一下open中有哪些标志位。
O_RDONLY:只读方式打开
O_WRONLY:只写方式打开
O_RDWR:读写方式打开
O_CREAT:文件不存在时,创建文件
O_TRUNC:打开文件时,清空文件内容
O_APPEND:文件以追加内容的形式打开
上述标志位中,前三个标志位,必须要选择一个,其它标志位则作为附加。
2.3.2 读文件
fd:这个是文件描述符,open函数成功打开文件后,便会返回文件描述符fd,对应相应文件。
buf:为写入的缓冲区。
count:为至多读入的字节数。
2.3.3 写文件
buf:为读取的缓冲区。
count:为至多写入的字节数。
2.3.4 关闭文件
通过相应的文件描述符fd来关闭文件。
2.3.5 综合运用
在上述代码中,需特别注意,写完文件后,需关闭文件,再以读的方式打开。这是因为,写文件过后,文件内部用于定位的指针在文件末尾,而我们需要重头开始读文件,这样才能读取到内容。因此,必须关闭文件,再重新打开文件,以重置该文件指针到开头,或者使用重定位文件指针的系统调用。