分类: LINUX
2010-07-09 11:09:52
今天完成一个文件锁的实验。
文件锁用来解决文件共享的问题。
文件锁分为读取锁和写入锁。读取锁为共享锁,写入锁为排斥锁。
LINUX中实现锁函数有lockf和fcntl。后者应用广泛,本实验也是基于后者。
源代码来自华清远见。
写入锁代码:
#include
#include
#include
#include
#include
#include
//文件记录锁的功能代码
int lock_set(int fd, int type)
{
struct flock old_lock, lock;
lock.l_whence=SEEK_SET;
lock.l_start=0;
lock.l_len=0;
lock.l_type=type;
lock.l_pid=-1;
//判断是否可以上锁
fcntl(fd, F_GETLK, &lock);
if(lock.l_type!=F_UNLCK)
{
if(lock.l_type==F_RDLCK)//已有读取锁
{
printf("read lock already set by %d\n", lock.l_pid);
}
else if(lock.l_type==F_WRLCK)//已有写入锁
{
printf("write lock already set by %d\n",lock.l_pid);
}
}
lock.l_type=type;//可能已近被修改
if((fcntl(fd, F_SETLKW, &lock))<0)
{
printf("lock failed:type=%d\n",lock.l_type);
return 1;
}
//根据不同TYPE进行上锁
switch(lock.l_type)
{
case F_RDLCK:
{
printf("read lock set by %d\n",getpid());
}
break;
case F_WRLCK:
{
printf("write lock set by %d\n",getpid());
}
break;
case F_UNLCK:
{
printf("release lock by %d\n",getpid());
return 1;
}
break;
default:
break;
}
return 0;
}
int main(void)
{
int fd;
fd=open("hello",O_RDWR|O_CREAT, 0644);//打开HELLO文件
if(fd<0)
{
printf("open file error\n");
exit(1);
}
lock_set(fd, F_RDLCK);//写入锁
getchar();
lock_set(fd, F_UNLCK);//解锁
getchar();
close(fd);
exit(0);
}
执行结果:
端口1
端口2
今天继续完成锁的实验。
为文件读取锁部分。
实验源代码来自华清远见。
读取锁代码:
#include
#include
#include
#include
#include
#include
//文件记录锁的功能代码
int lock_set(int fd, int type)
{
struct flock old_lock, lock;
lock.l_whence=SEEK_SET;
lock.l_start=0;
lock.l_len=0;
lock.l_type=type;
lock.l_pid=-1;
//判断是否可以上锁
fcntl(fd, F_GETLK, &lock);
if(lock.l_type!=F_UNLCK)
{
if(lock.l_type==F_RDLCK)//已有读取锁
{
printf("read lock already set by %d\n", lock.l_pid);
}
else if(lock.l_type==F_WRLCK)//已有写入锁
{
printf("write lock already set by %d\n",lock.l_pid);
}
}
lock.l_type=type;//可能已近被修改
if((fcntl(fd, F_SETLKW, &lock))<0)
{
printf("lock failed:type=%d\n",lock.l_type);
return 1;
}
//根据不同TYPE进行上锁
switch(lock.l_type)
{
case F_RDLCK:
{
printf("read lock set by %d\n",getpid());
}
break;
case F_WRLCK:
{
printf("write lock set by %d\n",getpid());
}
break;
case F_UNLCK:
{
printf("release lock by %d\n",getpid());
return 1;
}
break;
default:
break;
}
return 0;
}
int main(void)
{
int fd;
fd=open("hello",O_RDWR|O_CREAT, 0644);//打开HELLO文件
if(fd<0)
{
printf("open file error\n");
exit(1);
}
lock_set(fd, F_RDLCK);//写入锁
getchar();
lock_set(fd, F_UNLCK);//解锁
getchar();
close(fd);
实验结果:
端口1
端口2
注:
同上次实验相对比,很容易从结果看出:写入锁为互斥锁,同一时刻只能有一个存在。
读取锁为共享锁。