linux文件锁

目录

一、概念 

二、给整个文件上锁

三、给文件的某个区域上锁    


一、概念 

    为了解决不同进程操作同一个公共资源时,产生冲突的问题,
    引入文件锁,当进程操作共享资源时,要求每一个进程都先获取文件锁,然后才能操作共享资源
    文件锁分为:
        共享锁:多个进程可以同时获取
        互斥锁:在同一时刻只能有一个进程获取
    
    当多个进程操作公共资源时,谁先拿到互斥锁谁就可以对资源进行操作,其他进程就必须要等待,
    释放了互斥锁后,才可以获取,这样就解决了冲突的问题。
    

上锁有两种方式:

二、给整个文件上锁


     #include <sys/file.h>
    int flock(int fd, int operation);
    //参数1 ------ 要上锁的文件描述符
    //参数2 ------ 锁的类型  LOCK_SH   LOCK_EX   LOCK_UN
    //返回值 ---- 成功:0,失败:-1
    
    例如: 

 int main(int argc,char **argv)                             
 {                                                           
     int fd;                                                
     char *str = "farishgt";                                 
     int i;                                                  
                                                             
     if((fd = open(argv[1],O_RDWR|O_CREAT,0666)) < 0){       
         perror("open");                                    
         exit(1);                                           
     }                                                      
                                                             
     //给文件上互斥锁                                      
     if(flock(fd,LOCK_EX) < 0){                               
         perror("flock");                                     
         exit(1);                                           
     }                                                      
                                                            
     //操作公共资源                                        
     for(i = 0; i < 20; i++){                               
         write(fd,str,strlen(str));                          
         printf("%s\n",str);                                    
         sleep(1);                                        
     }                                                      
                                                            
     //解锁                                                
     if(flock(fd,LOCK_UN) < 0){                                
         perror("flock");                                  
         exit(1);                                           
     }                                                      
     close(fd);                                           
     return 0;                                               
 }                                                         
 int main(int argc,char **argv)
 {
     int fd;
     char *str = "helloworld";
     int i;

     if((fd = open(argv[1],O_RDWR|O_CREAT,0666)) < 0){
         perror("open");
         exit(1);
     }

     //给文件上互斥锁
     if(flock(fd,LOCK_EX) < 0){
         perror("flock");
         exit(1);
     }

     //操作公共资源
     for(i = 0; i < 20; i++){
         write(fd,str,strlen(str));
         printf("%s\n",str);
         sleep(1);
     }

     //解锁
     if(flock(fd,LOCK_UN) < 0){
         perror("flock");
         exit(1);
     }
     close(fd);
     return 0;
 }


三、给文件的某个区域上锁    

    #include <unistd.h>
    include <fcntl.h>

    int fcntl(int fd, int cmd, ... /* arg */ );
    //参数1 ----- 文件描述符 
    //参数2 ----- 功能选项:
                    功能1:Duplicating a file descriptor(复制文件描述符)
                    功能2:File descriptor flags   (设置或获取文件描述符的标志位)
                    功能3:File status flags (设置或获取文件状态标志位:O_RDONLY, O_WRONLY, O_RDWR  O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC)
                    功能4: Advisory record locking(设置或获取文件锁) 
                             struct flock {
                                   ...
                                   short l_type;    /* Type of lock: F_RDLCK, F_WRLCK, F_UNLCK */
                                   short l_whence;  /* How to interpret l_start:  SEEK_SET, SEEK_CUR, SEEK_END */
                                   off_t l_start;   /* Starting offset for lock  相对l_whence的偏移,也是锁的起始位置*/
                                   off_t l_len;     /* Number of bytes to lock 锁的区域大小*/
                                   pid_t l_pid;     /* PID of process blocking our lock    (set by F_GETLK and F_OFD_GETLK) 进程ID*/
                                   ...
                               };
                    功能5: Managing signals(管理进程中收到的信号)
    //变参 ------ 根据参数2的不同,而传递不同类型的变参
    //返回值 ----- 成功:0,失败:-1
    
    例如: 

int main(int argc,char **argv)                           
 {                                                         
     int fd;                                               
     char *str = "老王正在上厕所";                           
     int i;                                                 
                                                       
     if((fd = open(argv[1],O_RDWR|O_CREAT,0666)) < 0){       
         perror("open");                                     
         exit(1);                                                
     }                                                     
                                                          
     printf("等待厕所的门被打开\n");                       
     //给文件的某个区域上锁                            
     struct flock fl = {F_WRLCK, SEEK_SET,100,1024};        
     if(fcntl(fd,F_SETLKW,&fl) < 0){                      
         perror("flock");                                 
         exit(1);                                                 
     }                                                       
                                                             
     //操作公共资源                                        
     for(i = 0; i < 20; i++){                                
         write(fd,str,strlen(str));                        
         printf("%s\n",str);                                       
         sleep(1);                                        
     }                                                       
                                                           
     //解锁                                                    
     fl.l_type = F_UNLCK;                                   
     if(fcntl(fd,F_SETLK,&fl) < 0){                          
         perror("flock");                                        
         exit(1);                                           
     }                                                      
     printf("老王上完厕所了!\n");                       
     close(fd);                                             
     return 0;                                              
 }                                                        
#include <sys/file.h>
 int main(int argc,char **argv)
 {
     int fd;
     char *str = "小明正在上厕所";
     int i;

     if((fd = open(argv[1],O_RDWR|O_CREAT,0666)) < 0){
         perror("open");
         exit(1);
     }

     printf("等待厕所门打开\n");
     //给文件的某个区域上锁
     struct flock fl = {F_WRLCK, SEEK_SET,100,1024};
     if(fcntl(fd,F_SETLKW,&fl) < 0){
         perror("flock");
         exit(1);
     }

     //操作公共资源
     for(i = 0; i < 20; i++){
         printf("%s\n",str);
         sleep(1);
     }

     //解锁
     fl.l_type = F_UNLCK;
     if(fcntl(fd,F_SETLK,&fl) < 0){
         perror("flock");
         exit(1);
     }
     printf("小明上完厕所了\n");
     close(fd);
     return 0;
 }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值