文件锁
作用:解决多个进程对文件的操作冲突,执行文件之前加锁,,能加上锁再操作,上锁后,其他进程无法对文件进行操作
#include <fcntl.h>
int fcntl(int fd, F_SETLK/F_SETLKW, struct flock* lock)
功能:加解锁
参数:F_SETLK 非阻塞模式 加锁加不上立即返回
F_SETLKW 阻塞模式 加锁一直到成功为止才返回
lock 要加的锁
⭐struct flock{
short I_type; //锁类型:F_RDLCK/F_WRLCK/F_UNLCK
short I_whence; //锁区偏移起点:SEEK_SET/SEEK_CUR/SEEL_END
off_t I_start; //对于起点偏移字节数
off_t I_len; //锁区字节数 给0一直锁到文件尾
pid_t I_pid; //加锁进程的PID,-1表示自动设置
}
返回值:成功返回0,失败返回-1
⭐文件锁是一个君子协议,大家都遵循加锁——读写——解锁按部就班执行才能生效,当一个进程对一个被其他进程已加锁的文件直接进行读写操作时,不会被约束。
当close()函数关闭描述符时,该进程所加的锁会自动解除
当进程结束时,所有文件描述符所加的一切锁都被自动解除
锁实质就是建一个名为锁表的链表,加锁就是通过指针遍历验证在锁表中是否有重复的锁节点,没有就加节点
sleep(int x);
作用:延时x秒
文件的元数据
#include <sys/stat.h>
int stat(char const* path, struct stat* buf);
int fstat(int fd, struct stat* buf);
int lstat(char const* path, struct stat* buf);
功能:从i节点提取文件的元数据,即属性信息,存入buf结构体中
参数:path:文件路径
buf: 文件元数据结构
fd: 文件描述符
成功返回0,失败返回-1;
struct stat{
dev_t st_dev; //设备id
ino_t st_ino; //i节点号
mode_t st_mode; //文件的类型和权限
nlink_t st_nlink; //硬链接数
uid_t st_uid; //拥有者用户id
gid_t st_gid; //拥有者组id
dev_t st_rdev; //特殊设备id
off_t st_size; //总字节数
blksize_t st_blksize; //I/O块字节数
blkcnt_t st_blocks; //存储块数
time_t st_atime; //最后访问时间
time_t st_mtime; //最后修改时间
time_t st_ctime; //最后状态改变时间
}
⭐st_mode被定义为32位无符号整数,只有低16位有意义,从高到低
b15-b12:文件类型
b11-b9:设置用户id,设置组id,粘滞
b8-b6:拥有者用户的读、写和执行权限
b5-b3:拥有者组的读、写和执行权限
b2-b0:其他用户的读 写和执行权限
有参宏辅助分析文件类型,是返回1,否返回0
S_ISREG() 是否普通文件
S_ISDIR() 是否目录
S_ISSOCK() 是否本地套接字
S_ISCHR() 是否字符设备
S_ISBLK() 是否块设备
S_ISLNK() 是否符号链接
S_ISFIFO() 是否有名管道
通过内存映射文件可以实现一个文件对两个进程的关联,进程之间的通讯
strcpy()函数不是专门的文件读写函数,无法改变文件大小,一旦写入的字符串超过文件大小,写入会失败