Chinaunix首页 | 论坛 | 博客
  • 博客访问: 201149
  • 博文数量: 81
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 540
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-04 12:48
文章分类
文章存档

2015年(23)

2014年(58)

我的朋友

分类: C/C++

2015-01-09 09:34:53

fcntl 记录锁

很多时候,当我们有多个进程要访问同一个文件的时候,为了防止多进程访问导致的不一致,我们就要考虑进程间的同步问题了。fcntl是一个非常强大的函数,在这里我们可以使用它来给文件的某一个部分上锁。先来看一下它的声明:
  1. int fcntl(int filedes, int cmd, ... /* struct flock *flockptr */ );  

很显然,这是一个拥有可变参数的函数声明,filedes自然是要操作的文件描述符,对与记录锁相关的操作,cmd只能是F_GETLK, F_SETLK, 或者 F_SETLKW,而第三个参数则必须是一个指向flock结构体的指针,来看一下该结构体的内部结构:
  1. struct flock {  
  2.     short l_type;/*F_RDLCK, F_WRLCK, or F_UNLCK */  
  3.     off_t l_start;/*offset in bytes, relative to l_whence */  
  4.     short l_whence;/*SEEK_SET, SEEK_CUR, or SEEK_END */  
  5.     off_t l_len;/*length, in bytes; 0 means lock to EOF */  
  6.     pid_t l_pid;/*returned with F_GETLK */  
  7. };  

第一个成员是加锁的类型:只读锁,读写锁,或是解锁。l_start和l_whence用来指明加锁部分的开始位置,l_len是加锁的长度,l_pid是加锁进程的进程id。比如说,我们现在需要把一个文件的前三个字节加读锁,则该结构体的l_type=F_RDLCK, l_start=0, l_whence=SEEK_SET, l_len=3,l_pid不需要指定,然后调用fcntl函数时,cmd参数使用F_SETLK.
阅读(924) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~