记录锁的功能是:当地一个进程正在读或者修改文件的某个部分的时候,使用记录锁可以阻止其他进程修改同一文件区。
1.fcntl记录锁
#include <fcntl.h>
nt fcntl(int fd, int cmd, struct flock *lock);
//返回值成功依赖于cmd,失败返回-1
对于记录锁,cmd是F_GETLK,F_SETLK或者F_SETLKW。
第三个参数是一个指向flock结构的指针
struct flcok
{
short int l_type; //锁类型:F_RDLCK,F_WRLCK,F_UNLCK
short int l_whence; //决定l_start 位置
off_t l_start; //锁定区域的开头位置
off_t l_len; //锁定区域的大小
pid_t l_pid; //锁定动作的进程
};
关于解锁和加锁区域有以下几个注意事项:
- 指定区域起始偏移量的两个元素与lseek函数中最后两个参数类似。
- 锁可以在当前文件尾端处开始或者越过尾端处开始,但是不能在文件起始位置之前开始。
- 如果l_len为0,则表示锁的范围可以扩展到最大可能的偏移量。这意味着不管向该文件追加了多少写数据,它们都可以处于锁的范围内。
- 为了对整个文件加锁,我们设置l_start和l_whence指向文件的起始位置,并且指定长度为0。
上面提到了两种类型的锁:共享读锁和独占性写锁。基本规则是,任意多个进程在一个给定的字节上可以有一把共享的读锁,但是在一个给定字节上只能有一个进程有一把独占写锁。