C语言接口
文件操作函数接口:
fopen
:用于打开文件。fclose
:用于关闭文件。fputc
:用于写入一个字符。fgetc
:用于读取一个字符。fputs
:用于写入一个字符串。fgets
:用于读取一个字符串。fprintf
:用于格式化写入数据。fscanf
:用于格式化读取数据。fwrite
:用于向二进制文件写入数据。fread
:用于从二进制文件读取数据。fseek
:用于设置文件指针的位置。ftell
:用于计算当前文件指针相对于起始位置的偏移量。rewind
:用于设置文件指针到文件的起始位置。ferror
:用于判断文件操作过程中是否发生错误。feof
:用于判断文件指针是否读取到文件末尾。
文件操作示例:
- 使用
fopen
打开文件,写入数据,然后使用fclose
关闭文件。 - 使用
fopen
打开文件,读取数据,然后使用fclose
关闭文件。
系统IO
默认打开的三个流:
- 标准输入流(stdin):通常对应键盘输入。
- 标准输出流(stdout):通常对应显示器输出。
- 标准错误流(stderr):通常对应显示器输出。
系统IO函数原型:
int open(const char *pathname, int flags, mode_t mode)
:用于打开文件。int close(int fd)
:用于关闭文件。ssize_t write(int fd, const void *buf, size_t count)
:用于写入数据。ssize_t read(int fd, void *buf, size_t count)
:用于读取数据。
文件描述符即重定向:
- 文件描述符(File Descriptor)是操作系统用于标识和管理已打开文件的整数值。
- 每个进程都有一个文件描述符表(
fd_array
),用于跟踪它所打开的文件和其他I/O资源。
文件重定向原理:
- 文件重定向是通过修改文件描述符表中的文件描述符和相应的文件关联来实现的。
- 通过关闭一个文件描述符,然后新打开一个文件,根据文件描述符的分配规则,新打开的文件分配到的文件描述符将是刚刚被关闭的文件描述符,此时就可以实现输出、输入和追加重定向了。
或者采用系统接口来完成:
dup2
函数:int dup2(int oldfd, int newfd)
用于将oldfd
文件描述符的内容拷贝到newfd
文件描述符中。- 输出重定向:关闭标准输出文件描述符(1),然后使用
dup2
将其他文件的描述符拷贝到标准输出(1)。 - 追加重定向:类似于输出重定向,但在打开文件时使用
O_APPEND
标志,以实现将数据追加到文件末尾而不是覆盖文件。 - 输入重定向:关闭标准输入文件描述符(0),然后使用
dup2
将其他文件的描述符拷贝到标准输入(0)。
标准输出流和标准错误流的区别:
- 标准输出流(stdout)用于标准输出,通常是打印到屏幕。
- 标准错误流(stderr)用于标准错误输出,通常也是打印到屏幕。
- 重定向标准输出流不会影响标准错误流。
Linux EXT2文件系统
EXT2文件系统的基本结构:
- EXT2文件系统对磁盘进行分区,每个分区包括一个启动块和多个块组。
- 块组是文件系统的基本组成单元,每个块组包括超级块、块组描述符表、块位图、inode位图、inode表和数据块。
文件系统元信息:
- 超级块(Super Block)存储文件系统的整体信息,包括块数、inode数、最后挂载时间等。
- 块组描述符表(Group Descriptor Table)存储每个块组的属性信息。
- 块位图(Block Bitmap)记录哪些数据块被占用。
- inode位图(Inode Bitmap)记录每个inode是否被使用。
- inode表(Inode Table)存储文件的属性信息。
- 数据块(Data Blocks)用于存储文件的实际内容。
文件的创建、写入和删除:
- 创建一个空文件:通过分配一个空闲的inode,并在inode表中填充文件属性信息,然后将文件名和inode关联添加到目录文件的数据块中。
- 写入文件信息:通过inode找到文件的数据块,将数据写入数据块中,如果需要扩充数据块,使用索引来扩展。
- 删除文件:将文件对应的inode和数据块标记为无效,不会真正删除数据,可以在短时间内恢复。
文件拷贝和删除速度差异:
- 拷贝文件较慢,因为需要创建文件并写入数据,这涉及到分配inode和数据块。
- 删除文件较快,因为只需标记inode和数据块为无效,无需真正删除数据。
目录的特点:
- 目录也被看作文件,具有自己的inode和属性信息。
- 目录的数据块存储文件名和对应文件的inode指针,实现文件名与文件内容和属性的关联。
软硬链接
软链接(Symbolic Link):
- 通过
ln -s
命令创建软链接。 - 软链接文件有自己的独立inode,但只包含源文件的路径名,因此文件大小要比源文件小得多。
- 软链接相当于Windows中的快捷方式,是源文件的一个标记。
- 如果删除源文件,软链接将失效,无法执行或查看其内容。
硬链接(Hard Link):
- 通过
ln
命令创建硬链接。 - 硬链接文件与源文件共享相同的inode和数据块,因此文件大小和inode号相同。
- 硬链接是源文件的别名,多个文件名指向同一个inode。
- 即使删除源文件,硬链接文件仍然可以正常执行,只是链接数减少。
- 目录的硬链接数为2是因为包含了隐含文件
.
和..
。