文件的读写锁

 如何使用linux 的文件读写锁呢

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>

#include<string.h>

//错误打印

void my_error(const char *str_error,int line){
        fprintf(stderr,"line:%d",line);
        perror(str_error);
        exit(1);
}


//设置文件锁

int lock_set(int fd,struct flock *lock){
        if(fcntl(fd,F_SETLK,lock)==0){
                if(lock->l_type==F_RDLCK){
                        printf("set read lock,pid:%d\n",getpid());
                }
                else if(lock->l_type==F_WRLCK){
                        printf("set write lock,pid:%d\n",getpid());
                }
                else if(lock->l_type==F_UNLCK){
                        printf("set release lock,pid:%d\n",getpid());
                }
        }else{
                perror("lock file fail\n");
                return -1;
        }
        return 0;
}



//测试锁是否可获取
int lock_test(int fd,struct flock *lock){
        if(fcntl(fd,F_GETLK,lock)==0){
                if(lock->l_type==F_UNLCK){
                        printf("lock can be set\n");
                        return 0;
                }else{




                        if(lock->l_type==F_WRLCK){
                                printf("can'n be set lock, write lock has been set by:%d\n",lock->l_pid);
                        }
                        else if(lock->l_type==F_RDLCK){
                                printf("can'n be set lock, read lock has been set by:%d\n",lock->l_pid);
                        }
                        return -2;
                }
        }else{
                perror("get  lock file fail\n");
                return -1;
        }
        //return 0;
}








int main(int argc ,char **argv){


        int fd;//文件描述符
        int ret;
        struct flock lock;
        char read_buf[32];
        int read_size;
        char s[]="hellow word\n",buff[80];
        if((fd=open("11.txt",O_CREAT|O_TRUNC|O_RDWR ,S_IRWXU))==-1){
                //perror("open");
                //exit(1);
                my_error("open",__LINE__);




        }


        if(write(fd,"test lock",10)!=10){


                my_error("write",__LINE__);


        }
        //初始化lock
        memset(&lock,0,sizeof(struct flock));
        lock.l_start=SEEK_SET;
        lock.l_len=0;
        lock.l_whence=0;
        //设置读锁
       lock.l_type=F_RDLCK;


        if(lock_test(fd,&lock)==0){


                lock.l_type=F_RDLCK;
                lock_set(fd,&lock);


        }
        //读数据
        lseek(fd,0,SEEK_SET);
        if((ret=read(fd,read_buf,10))<0){


                my_error("read",__LINE__);
        }
        read_buf[ret]='\0';
        //打印
        printf("%s\n",read_buf);
        //暂停
        getchar();


       //检测是否能获取写锁
       lock.l_type=F_WRLCK;


        if(lock_test(fd,&lock)==0){


                lock.l_type=F_WRLCK;
                lock_set(fd,&lock);


        }


        //释放锁
       lock.l_type=F_UNLCK;
        lock_set(fd,&lock);


        close(fd);
        return 0;

}


编译

 gcc -o my_lokc my_lokc.c 


使用两个终端 测试 ./my_lokc 

第一个终端:

lock can be set
set read lock,pid:19580
test lock
f
lock can be set
set write lock,pid:19580
set release lock,pid:19580


第二个终端:


lock can be set
set read lock,pid:19582
test lock
a
can'n be set lock, read lock has been set by:19580
set release lock,pid:19582

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值