文章学习自<<unix高阶编程>>第十二章高级 IO
原型:
int fcntl(int filedes,int cmd,.../*struct flock *flockptr*/)
cmd的从参数值:
FGETLK、FSETLK、F_SETLKW
第三个参数是
flock 的指针
struct flock{
short l_type;
off_t l_start;
short l_whence;
off_t l_len;
pid_t l_pid;
}
解释:
l_type:F_RDLCK (共享读锁)、F_WRLCK(独占性写锁)、FUNLCK(解锁一个区域)
l_start 和 l_whencea 加锁解锁区域的起始地址,l_start是相对位移量,l_whencea决定了相对位移量的起点(和lseek很像)
l_len 表示区域的长度(入过l_en为0,则表示从区域起点开始直至最大可能位置为止)
如果要锁住整个文件,l_start一般说明为0,l_whence说明为SEEK_SET,l_len设置为0
锁的类型:
读锁 写锁
无锁 可以 可以
一把或多把读锁 可以 拒绝
一把或多把写锁 拒绝 拒绝
cmd指令介绍:
F_GETLK 决定由flockptr锁描述的锁是否被另外一把锁所排斥(阻塞)。如果存在一把锁,他阻止flockptr锁创建的锁,则把现存的锁的信息写到flockptr指向的结构体中。如果不存在,flockptr指向的结构体中的其他信息保持不变
F_SETLK设置锁,如果设置不允许则返回EACCES或者EAGAIN作为错误码
F_SETLKW,这是设置F_SETLK的阻塞版本(w是英语的wait表示等待),注意实际中我们需要用F_GETLK来判断是否可以建立锁
,然后用F_SETLK或者F_SETLKW建立锁,但是F_SETLK或者F_SETLKW并不是原子操作,所以在两个操作之间可能存在另一个进程插入并且建立一个相关的锁,导致F_GETLK的测试结果发生变化
,所以我们应该使用F_SETLK,并且对返回结果测试,以判别是否可以建立锁要求的锁