文件锁可用于实现多用户多任务共享数据
linux提供两种方法实现文件锁定:
1.以原子操作的方式创建一个文件,我们称之为锁文件,当这个文件被创建后,不允许其他进程再创建同名文件
2.第二种方法允许程序锁定文件的一部分,从而可以独享对这部分内容的访问,这种方法被称为区域锁定
#include <fcntl.h>
int fcntl(int fildes, int command, ...);
fcntl()对一个打开的文件描述符进行操作,并能根据command参数的设置完成不同的任务.command为我们提供了三个用于文件锁的命令:
1.F_GETLK
使用这三个命令时,第三个参数必须是一个flock结构体指针,所以有效的函数原型应该是
int fcntl(int fildes, int command, struct flock *flock_struct);
flock结构依赖于具体的实现,但它至少包括下述成员:
short l_type:锁的类型,有三种取值:
F_RDLCK是共享锁,其他进程可以拥有同一区域上的共享锁,只要任一进程拥有该区域的共享锁,就没有进和能够拥有该区的独占锁,文件必须以读或读/写方式打开;
F_WRLCK独占锁.只有一个进程可以在文件的某个区域拥有一把独享锁,一旦一个进程拥有了独享锁,那么相应的区域就不能再有任务锁,文件需以写或读/写方式打开;
F_UNLCK解锁,用来清除锁
short l_whence:区域的开头方式,他的取值只能是SEEK_SET,SEEK_CUR, SEEK_END三个中的一个,SEEK_SET表示从文件头开始,SEEK_CUR表示从文件当前位置开始,SEEK_END表示从文件尾开始.l_chence定义了l_start的偏移量
off_t l_start:区域开始的相对位置
off_t l_len:区域的长度
pid_t l_pid:锁持有者的进程id
F_GETLK命令获得fildes参数打开的文件的锁信息.它不会锁定文件,只是返回阻止进程获取锁的文件信息.如果调用成功,则返回一个非-1的值,否则返回-1
2.F_SETLK:对文件的区域加锁,fcntl()第二个参数设为该命令时,l_pid不使用.如果调用成功,则返回一个非-1的值,否则返回-1,这个命令总是立即返回
3.F_SETLKW:与F_SETLK相似,但不会立即返回,而等待直到能够获取锁为止