分类: C/C++
2009-06-01 21:26:37
linux下的文件锁定有几种方式,在这里主要说fcntl系统调用实现的锁定
fcntl的原型我们可以在头文件中看到是这样定义的
#include
#include
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
在这里我们主要用的是第三种型式即:
int fcntl(int fd, int cmd, struct flock *lock);
flock的结构如下
/usr/include/bits/types.h
struct flock
{
short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
#ifndef __USE_FILE_OFFSET64
__off_t l_start; /* Offset where the lock begins. */
__off_t l_len; /* Size of the locked area; zero means until EOF. */
#else
__off64_t l_start; /* Offset where the lock begins. */
__off64_t l_len; /* Size of the locked area; zero means until EOF. */
#endif
__pid_t l_pid; /* Process holding the lock. */
};
结构体中l_type 是文件锁定的类型 有F_RDLCK共享性读锁定,F_WRLCK独占性写锁定和F_UNLCK释放锁定
成员 l_whence 和lseek类似,有几个可选的参数 SEEK_SET 文件头 SEEK_CUR当前位置SEEK_END文件末尾 该字段设定锁定的区域的启始地址
区域的长度 l_len 也就是锁定的长度 若该值为0则表示锁定的区域从其起点开始(由l_start和l_whence决定)开始直至最大可能位置为址! 该值不能在文件的起始位置之前开始或越过该超始位置。
为了锁定整个文件,通常的做法是将l_start说明为0,l_whence说明为SEEK_SET,l_len说明为0
小试牛刀:程序只作演示测试,并没有作太多的错误处理
#include
#include
#include
#include
#include
#include
#include
#include
void die(char *s)
{
fprintf(stderr,s);
exit(1);
}
int main(void)
{
FILE *fp;
int fd;
struct flock lock;
fp = fopen("a.txt","w");
if (!fp)
die("open file error\n");
fd = fileno(fp);
lock.l_type=F_WRLCK;
lock.l_whence=SEEK_SET;
lock.l_start=0;
lock.l_len=0;
if(fcntl(fd,F_SETLK,&lock)<0)
{
die("fcntl set error\n");
}
while(1) pause();
}