a文件锁定的是整个文件,而记录锁定只锁定文件的某一特定部分。UNIX的记录指的
是从文件的某一相对位置开始的一段连续的字节流,它不同于其它以强制性记录结构阻止
文件的操作系统,因此,UNIX记录锁更恰当的称呼应该是范围锁,它是对文件某个范围
的锁定。
文件和记录锁定可分为咨询式锁定和强制锁定两种.
咨询式锁定后,其它想要访问该文件的进程将被操作系统告知共享文件已经上了锁,但这并不阻止它们对锁定文件的操作.只要有对锁定文件的存取权,这些进程便可忽视咨询式锁定而去写赏了锁的文件。强制锁定的含义则要严格多了,当某一共享文件被强制后,操作系统将会对每个读写文件的请求进行核查,只有在确证该请求不会干扰上了锁的文件时,才允许对应的操作.
System V 的咨询锁定:
F_ULOCK 为一个先前锁定的区域解锁
F_LOCK 锁定一个区域
F_TLOCK 测试并锁定一个区域
F_TEST 测试一个区域是否已经上锁。
#include
my_lock(int fd)
{
lseek(fd,0L,0);
if (lockf(fd,F_LOCK,0L)==-1)
{
perror("can't F_LOCK");
exit(1);
}
}
my_unlock(int fd)
{
lseek(fd,0L,0);
if(lockf(fd,F_ULOCK,0L)==-1)
{
perror("can't F_UNLOCK");
exit(1);
}
}
BSD 的咨询式锁定:
LOCK_SH 共享锁
LOCK_EX 互斥锁
LOCK_UN 解锁
LOCK_NB 当文件已被锁定时不阻塞
#include
my_flock(int fd)
{
if (flock(fd,LOCK_EX))==-1)
{
perror(“can LOCK_EX”);
exit(1);
}
}
my_unload(fd)
{
if (flock(fd,LOCK_UN)==-1)
{
perror(“can’t LOCK_UN”);
exit(1);
}
}
由于 Linux支持上面的两种锁定方式,所以可以根据不同的实际情况选用不同的锁定
方式。以上的两种锁定方式有以下的不同:
1.System V的锁定方式是记录锁定,可以指定锁定的范围。而BSD的锁定方式是文
件锁定,只能指定锁定文件。
2.System V的锁定是每个进程所独有的,可以用于父子进程间的共享锁定。而BSD
的锁定方式是可以继承的,父子进程间使用的是同一锁定的,所以不能用于父子进程间的
文件共享锁定。
文件锁:
structflock {
shortl_type;文件锁类型,读锁,写无锁
off_t l_start;字节偏移
shortl_whence;设置偏移
off_t l_len;0到文件结尾,长度
pid_t l_pid;返回值
};
F_SETLK 解锁orF_SETLKW上锁,
#include
#include
#include
#include
#include
intmain(intargc,char*argv[])
{
structflockfl={F_WRLCK,SEEK_SET,0,0,0};
intfd;
fl.l_pid=getpid();
if(argc>1)
fl.l_type=F_RDLCK;
if((fd=open("1.txt",O_RDWR))==-1){
perror("open");
exit(1);
}
printf("Press<ENTER>totrytogetlock:");
getchar();
printf("Tryingtogetlock...");
if(fcntl(fd,F_SETLKW,&fl)==-1){
perror("fcntl");
exit(1);
}
printf("gotlock\n");
printf("Press<ENTER>toreleaselock:");
getchar();
fl.l_type=F_UNLCK;
if(fcntl(fd,F_SETLK,&fl)==-1){
perror("fcntl");
exit(1);
}
printf("Unlocked.\n");
close(fd);
return0;
}