文件锁的类型
1、读锁:共享锁,如果A进程对文件的某的区域加了读锁,B进程也可以在此区域加读锁,但是不能对此区域加写锁。
2、写锁:读占锁,如果A进程对文件的某个区域加了写锁,B进程就不能对此区域加写锁,也不能对此区域加读锁。
当多个进程同时对一个文件进行读写操作时,为确保文件的完整和一致,这几个进程要加锁同步。
当进程开始读取文件的某个区域时,先加读锁,读完之后再解锁。
结构体:
struct flock{
short l_type; //加锁的类型:F_RDLCK(读锁) F_WRLCK(写锁) F_UNLCK(解锁)
short l_whence; //什么文字开始加锁:SEEK_SET SEEK_CUR SEEK_END
off_t l_start; //开始加锁的位置
off_t l_len; //加锁的长度
pid_t l_pid; //加锁的进程ID:只在F_GETLK的时候使用
}
typedef struct flock fk;
int main(void)
{
int fd = open("a.txt",O_RDONLY|O_APPEND);
if(-1 == fd)
perror("error"),exit(-1);
fk lock;
lock.l_type = F_RDLCK; //加读锁
lock.l_whence = SEEK_SET; //从文件的开始位置
lock.l_start = 10; //加锁的开始位置为10
lock.l_len = 100; //长度为100
int res = fcntl(fd,F_SETLK,&lock); //执行加锁
if(-1 == res)
perror("error"),exit(-1);
else
puts("SET FILE LOCK SUCESS!");
lock.l_type = F_UNLCK; //解锁
res = fcntl(fd,F_SETLK,&lock);
if(-1 == res)
perror("error"),exit(-1);
puts("UNLOCK FILE SUCESS!");
加锁是几个进程之间的事情,单进程没必要加锁
宏 F_SETLKW:表示等待加锁(等待另一进城的文件锁解开,然后加锁),
fcntl(fd,F_SETLKW,&lock) //由于宏F_SETLKW的关系成为阻塞函数。