文件的读写锁

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

#include
#include
#include
#include
#include
#include
#include

#include

//错误打印

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

你可能感兴趣的:(linux,c)