分类: LINUX
2013-12-20 11:05:38
原文地址:fcntl函数的说明与实例 (文件加锁) 作者:fly123456789
文件锁包括强制锁和建议锁两种,不过一般系统和内核都是用的强制锁。
fcntl的函数原型:int fcntl(int fd, int cmd, struct flock *lock);
参数说明:fd是文件描述符;cmd 相当于命令符,F_SETLK和F_GETLK 是其常用值;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(写锁),F_UNLCK(解锁);(也即0.1.2三个值);
l_whence也有三种取值:SEEK_SET(文件开头),SEEK_END(文件结尾),SEEK_CUR(当前位置);
l_len 是加锁区域的长度;
l_pid 是加锁进程的pid号;
下面结一个小小的使用实例:
/* lock.h 文件 */
void file_lock(int fd,int type)
{
//定义一个flock的结构体,并对其赋值。
struct flock lock;
lock.l_type=type;
lock.l_whence=SEEK_SET; lock.l_start=0; lock.l_len=0;//此三个成员的值表示对整个文件加锁
while(1)
{
if((fcntl(fd,F_SETLK,&lock)==0)
{
if(lock.l_type==F_RDLCK)
printf("you got a readlock,thd pid = %d",getpid());
if(lock.l_type.l_type==F_WRLCK)
printf("you got a writelock,thd pid = %d",getpid());
if(lock.l_type.l_type==F_UNLCK)
printf("you got a realeselock,thd pid = %d",getpid());
return ;//加锁成功后,结束返回
}
//该文件上锁不成功
fcntl(fd,F_GETLK,&lock);//得到文件锁的信息,给 lock;
if(lock.l_type!=F_UNLCK)//判断不能上锁的原因
{
if(lock.l_type==F_RDLCK)//已有读锁了
printf("it is already a read lock!thd pid =%d\n",lock.l_pid);
else if(lock.l_type==F_WRLCK)//已有写锁了
printf("it is already a write lock!the pid =%d\n",lock.l_pid);
getchar();
}
}
}
/*主函数 filelock.c */
#include
#include
#include
#include
#include
#include
#inlcude"lock.h"
int main(){
int fd;
if((fd=open("filel.txt",O_RDWR,0666))<0){
perror("open filel.txt is error!");
exit(1);
}
//给文件上写入锁
file_lock(fd,F_WRLCK);
getchar();//为了方便观察,所以在此停顿一下
//文件解锁
file_lock(fd,F_UNLCK);
getchar();
close(fd);
return 0;
}
上面的注解已经比较详细了,你可以最好自已在机子上调试下,感受一下呵,特别提醒,运行时,在getchar() 停顿的时候来打下进程(窗口)运行该程序,可以看到 写锁的互斥现象;
你也可以在主函数里改改读锁的情况,会发现读锁与写锁有所不同的呵!