1 . 文件管理
1.1 标C文件处理和UC文件处理函数的比较:
标C文件处理函数比UC的文件处理函数速度快,因为标C内部独立输入输出缓冲区,
会积累一定数量之后再写入文件,因此读写效率比较高
使用time命令可以获取进程的运行时间
time b.out
real 0m0.081s =>真实时间
user => 用户态时间
sys => 内核时间
1.2 文件描述符:
进程 =》 文件描述符表=》文件表=》V字节(包含I字节)
文件描述符就是一个整数,可以代表打开的文件,但是文件的信息不是存在文件描述符中,而是存在文件表等结果中
当打开一个文件时,系统会把文件的信息存入文件表等结构中,但是处于安全的考虑,文件表等结构并不是直接操作,而
是给文件表对应一个编号,拿着编号进行操作,而编号就叫做文件描述符
在进程的内部维护一张文件描述符的总表,当使用open函数打开文件时,就会加载该文件的信息到内存中,然后去文件描述符
总表查找一个最小的未被使用的描述符建立和文件表对应的关系,而文件描述符是非负整数
close函数不会改变文件描述符的整数值,只是会让描述符无法代表一个文件
1.3 dup/dup2函数
#include <unistd.h>
int dup(int oldfd);
函数功能: 主要用于根据参数指定的描述符进行复制,成功返回新的描述符,失败返回-1
int dup2(int oldfd, int newfd);
函数功能:主要用于将oldfd参数指定的文件表地址拷贝到newfd中,如果newfd占用,则考虑强制关闭,
成功则返回文件描述符,失败返回-1
1.4 fcntl函数
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ..../*arg*/);
第一个参数:文件描述符(对哪个文件操作)
第二个参数:命令/操作(执行什么样的操作)
F_DUPFD
F_GETFD/F_SETFD
F_SETFL/F_SETGL
F_SETLK/F_SETLKW/F_GETLK
第三个参数:可变长参数
函数功能:
(1)主要用于复制文件描述符
(2)设置、获取文件描述符的功能
(3)设置获取文件状态标志的功能
(4)主要勇于实现建议文件锁的功能
1.5 使用fcntl实现文件锁的功能
(1)文件锁的作用
当有多个进程同时对一个共享文件进行读写操作时,可能会造成数据混乱和不一致性,理论上应该要求多个进程对文件
操作进行串行而不是并行,如果两个进程都是读文件则允许同时进行,只要有一个写操作,则另外一个进程应该等待,为
了实现该功能,需要借助文件锁来实现
(2)实现文件锁的功能,
fnctl函数的第三个参数值: 结构体指针
结构体: struct flock