文件锁:只能在进程同步使用,因为线程共享文件描述符
fcntl函数:获取,设置文件访问控制属性;
参数2:
F_SETLK(struct flock*) 设置文件锁(trylock)//非阻塞
F_SETLKW(strcut flock *)设置文件锁(lock)//阻塞
F_GETLK(struct flock *)获取文件锁
参数3:struct flock{
short l_type; 锁的类型:F_RDLCK F_WRLCK F_UNLCK
short_l_whence; 偏移位置:SEEK_SET,SEEK_CUR,SEEK_END;
off_t l_start; 起始偏移:1000
off_t len; 长度:0表示整个文件加锁;
pid_t l _pid; 持有该锁的进程ID;
}
分析:参数三为写锁时,执行程序getlock只能给一个进程,为读锁时,多个进程都可获得getlock;
与线程同步的读写锁机制相似:写独占,读共享;
代码分析
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<pthread.h>
#include<sys/types.h>
#include<sys/stat.h>
int main(int argc ,char *argv[])
{
int fd;
if(argc<2)
{
printf("./file name\n");
exit(1);
}
if((fd = open(argv[1],O_RDWR))<0)
{
perror("open error");
exit(1);
}
struct flock f_lock;//定义锁的属性
f_lock.l_type = F_WRLCK;//设置写锁
//f_lock.l_type=F_RDLCK;//设置读锁
f_lock.l_whence= SEEK_SET;
f_lock.l_start=0;
f_lock.l_len=0; //长度为0表示整个文件加锁
fcntl(fd,F_SETLKW,&f_lock);
printf("get lock\n");
sleep(10);//模拟加锁之后对文件的操作
f_lock.l_type=F_UNLCK;//设置解锁属性
fcntl(fd,F_SETLKW,&f_lock);
printf("un lock\n");
close(fd);
return 0;
}