文件锁定
文件锁定是多任务操作系统中一个非常重要的组成部分。程序通常需要共享数据,而通常是通过文件来实现的。
创建锁文件
许多应用程序只要能够针对某个资源创建一个锁文件即可。然后,其他程序就可以通过检查这个文件的状态来判断它们自己
是否被允许访问这个资源。(锁文件仅仅只是充当一个指示器的角色,程序需要通过相互协作来使用它们)
实例:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
int main()
{
int file_desc;
int save_errno;
file_desc=open("/tmp/LCK.test",ORDWR | O_CREAT | O_EXCL,0444);
if(file_desc == -1)
{
save_errno = errno;
printf("open failed with error %d/n",save_errno);
}
else
printf("open succeed/n");
exit (EXIT_SUCCESS);
}
第一次运行程序
open succeeded
再次运行
open failed with error 17
锁定区域
用创建件锁文件的办法来控制诸如串口之类的资源的独占实访问是一个不错的选择,但他并不适合用于访问大型的共享文件。
比如,你有一个大文件,由一个程序写入数据,但同时又有许多不同的程序同时对这个文件进行更新。这个时候,我们可以通过
锁定区域来解决这个问题,文件部分被锁定,但其他程序可以访问这个文件的其他部分。linux提供至少两种方式来完成这一工作
使用fcntl系统调用和lockf调用。现在我们来介绍fcntl接口:
fcntl接口 定义:
#include <fcntl.h>
int fcntl (int fildes,int command,struct flock *flock_structure);
fcntl对一个打开的文件描述符进行操作,并能根据command参数的设置完成不同的任务。他为我们提供来三个用于文件锁的命令:
F_GETLK //获取文件锁的信息
F_SETLK //设置文件锁定的状态
F_SETLKW //设置文件锁定的状态,但是无法建立锁定是,此调用会一直等到锁定动作成功为止
flock结构 定义如下:
struct flock{
short int l_type; //锁定的状态
short int l_whence; //决定l_stat的位置
off_t l_start; //锁定区域的开始位置
off_t l_len; //锁定区域的大小
pid_t l_pid; //锁定动作的进程
}