文件锁

来源:互联网 发布:java web实时应用程序 编辑:程序博客网 时间:2024/05/18 01:30

文件锁可用于实现多用户多任务共享数据

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相似,但不会立即返回,而等待直到能够获取锁为止