Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104347
  • 博文数量: 87
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-20 10:54
文章分类
文章存档

2016年(19)

2015年(2)

2013年(66)

我的朋友

分类: LINUX

2013-12-20 11:05:38

fcntl 函数是一个相当常用的对文件进锁操作的函数,在此对其做一下简单的说明和举例。

    文件锁包括强制锁和建议锁两种,不过一般系统和内核都是用的强制锁。

    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() 停顿的时候来打下进程(窗口)运行该程序,可以看到 写锁的互斥现象;

你也可以在主函数里改改读锁的情况,会发现读锁与写锁有所不同的呵!

阅读(447) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~