一、文件锁
文件锁用于多个用户共同使用或操作同一个文件。有读锁的时候可以再加读锁,不能再加写锁。有写锁的时候,不能加任何锁,加读锁时,该描述符必须是读打开,加写锁时,该描述符必须是写打开,且只在进程间有用。
重写的上锁方法
- //lock.c
- int lock_set(int fd,int type){
- struct flock lock;
- lock.l_type=type;
- lock.l_start=0;
- lock.l_whence=SEEK_SET;
- lock.l_len = 0;
- 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;
- //此处的F_SETLKW为F_SETLK的阻塞版本,当无法获取锁时进入睡眠等待状态
- if(fcntl(fd,F_SETLKW,&lock)<0){
- printf("Lock failed:type=%d!\n",lock.l_type);
- exit(1);
- }
- 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("UN lock set by %d\n",getpid());
- break;
- default:
- break;
- }
- }
上写锁
- #include<stdio.h>
- #include<fcntl.h>
- #include<unistd.h>
- #include"lock.c"
- int main(){
- int fd;
- fd=open("readme",O_RDWR|O_CREAT,0666);
- if(fd<0){
- printf("Open file error\n");
- exit(1);
- }
- lock_set(fd,F_WRLCK);
- getchar();
- lock_set(fd,F_UNLCK);
- getchar();
- return 0;
- }
上读锁
- #include<stdio.h>
- #include<fcntl.h>
- #include<unistd.h>
- #include"lock.c"
- int main(){
- int fd;
- fd=open("readme",O_RDWR|O_CREAT,0666);
- if(fd<0){
- printf("Open file error\n");
- exit(1);
- }
- lock_set(fd,F_RDLCK);
- getchar();
- lock_set(fd,F_UNLCK);
- getchar();
- return 0;
- }
在两个终端中测试:
两个终端可以同时加上读锁。
有一个终端加上读锁,则必须等读锁释放才能加写锁。
有一个终端加写锁必须释放才能加别的锁。
联系客服