snifer

【嵌入式】2013新的开始,谈谈给fcntl给文件加锁

0
阅读(6293)

2013年注定是个多事的时间,人类躲过了2012,迎来了新的篇章。

今天上午研究了一下linux下给文件加锁,今天就写写这个问题。

当多个用户共同使用、操作一个文件的时候,linux通常采用的方法是给文件上锁,来避免共享资源产生竞争的状态。

文件锁包括建议锁和强制性锁。建议性锁要求上锁文件的进程都要检测是否有锁存在,并尊重已有的锁。强制性锁由内核和系统执行的锁。

Fcntl不仅可以实施建议性锁而且可以实施强制性锁。

#include <sys/types.h>

#include <unistd.h>

#include <fcnt1.h>

int fcnt1(int filedes, int cmd,... struct flock flockptr ) ;

struct flock 结构

 所希望的锁类型:F_RDLCK(共享读锁)、F_WRLCK(独占性写锁)或F_UNLCK(解锁一个区域)
要加锁或解锁的区域的起始地址,由l_start和l_whence两者决定。l_stat是相对位移量(字节),l_whence则决定了相对位移量的起点。

 区域的长度,由l_len表示。  

关于加锁和解锁区域的说明还要注意下列各点:

1 该区域可以在当前文件尾端处开始或越过其尾端处开始,但是不能在文件起始位置之前开始或越过该起始位置。
2如若l_len为0,则表示锁的区域从其起点(由l_start和l_whence决定)开始直至最大可能位置为止。也就是不管添写到该文件中多少数据,它都处于锁的范围。
3为了锁整个文件,通常的方法是将l_start说明为0,l_whence说明为SEEK_SET,l_len说明为0。

      ioctl 函数是I / O操作的杂物箱。不能用本章中其他函数表示的I / O操作通常都能用i o c t l表示。终端I / O是ioctl 的最大使用方面,主要用于设备的I / O控制。

#include <unistd.h> /* SVR4 */

#include <sys/ioctl.h> /* 4.3+BSD * /

int ioctl(int filedes, int request, . . . ) ;

返回:若出错则为- 1,若成功则为其他值。

外面还有余震,就写这么多吧,谢谢大家。