unix高级IO文件锁

1. 注意fcntl()参数cmd 的正确使用 

创新互联为企业级客户提高一站式互联网+设计服务,主要包括成都做网站、成都网站制作、成都app软件开发公司、小程序开发、宣传片制作、LOGO设计等,帮助客户快速提升营销能力和企业形象,创新互联各部门都有经验丰富的经验,可以确保每一个作品的质量和创作周期,同时每年都有很多新员工加入,为我们带来大量新的创意。 

F_GETFL 用于测试锁使用

F_SETFL 无阻塞设置锁 fcntl()会尝试几次后,如果失败直接返回-1

F_SETLKW 阻塞设置锁 fcntl()会尝试后,如果失败会被系统挂起来,直到收到解锁的信号再去执行

2. 测试锁的时候 struct flock lock结构体成员 中的l_stype 需要设置为F_WRLCK 其它F_UNLCK,F_RDLCK会有问题

3.struct flock lock 成员使用

测试或锁 整个文件怎样设置

l_whence = SEEK_SET

l_start = 0;

l_len = 0; 如果l_len为0 表示 从start 开始一直到文件最后EOF

          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 */

               off_t l_len;     /* Number of bytes to lock */

               pid_t l_pid;     /* PID of process blocking our lock

                                   (F_GETLK only) */

               ...

           };


5.程序自己测试自己的锁, 测试后肯定是无锁状态

6.程序如果设置的两个区间 连续而且锁的性质一样,系统会自动地将两个锁合并成一个锁

7.更多可以参考以下牛人

http://zhuyunxiang.blog.51cto.com/653596/132548



执行结果: 

unix 高级IO 文件锁

在另一个终端执行

unix 高级IO 文件锁


main.c

  1. #include"setlock.h" 
  2. #include 
  3. #include  
  4. #include  
  5. #include  
  6.  
  7.  
  8. int main(void) 
  9.       int fd = open("./src", O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IXOTH); 
  10.        
  11.       check_lock(fd,0,10); 
  12.       check_lock(fd,11,20); 
  13.  
  14.       set_read_lock(fd,0,10); 
  15.       set_write_lock(fd,11,20); 
  16.        
  17.       sleep(15); 
  18.           
  19.       unlock(fd,0,10); 
  20.       unlock(fd,11,20); 
  21.        
  22.       return 0; 

setlock.h

  1. #ifndef SETLOCK_H 
  2. #define SETLOCK_H 
  3.  
  4. void check_lock(int fd,int start,int len); 
  5. void unlock(int fd,int start,int len); 
  6. void set_read_lock(int fd,int start,int len); 
  7. void set_write_lock(int fd,int start,int len); 
  8.  
  9. #endif // end SETLOCK_H 

setlock.c

 

  1. #include  
  2. #include  
  3. #include 
  4. #include 
  5. #include  
  6. #include 
  7.  
  8. void check_lock(int fd,int start,int len) 
  9.       struct flock lock; 
  10.       lock.l_type = F_WRLCK;  
  11.       lock.l_start = start; 
  12.       lock.l_whence = SEEK_SET; 
  13.       lock.l_len = start; 
  14.        
  15.       printf("check_lock------\n");  
  16.       if((fcntl(fd, F_GETLK, &lock)) == -1) 
  17.       { 
  18.             printf("1-check_lock: fcntl error\n"); 
  19.             exit(1); 
  20.       } 
  21.       switch(lock.l_type) 
  22.       { 
  23.             case F_RDLCK: 
  24.                         { 
  25.                               printf("[%d]:FRDLCK From %d To %d\n", lock.l_pid, start, len); 
  26.                               break; 
  27.                         } 
  28.              
  29.             case F_WRLCK: 
  30.                         { 
  31.                               printf("[%d]:F_WRLCK From %d To %d\n", lock.l_pid, start, len); 
  32.                               break; 
  33.                         } 
  34.              
  35.             case F_UNLCK: 
  36.                         { 
  37.                               printf("F_UNLCK\n"); 
  38.                               break; 
  39.                         } 
  40.              
  41.             default:  
  42.                         { 
  43.                               printf("2-check_lock: fcntl error"); 
  44.                               break; 
  45.                         }     
  46.       } 
  47.  
  48. void set_read_lock(int fd,int start,int len) 
  49.       printf("set_read_lock------\n");  
  50.        
  51.       struct flock lock; 
  52.       lock.l_type = F_RDLCK; 
  53.       lock.l_start = 0; 
  54.       lock.l_whence = SEEK_SET; 
  55.       lock.l_len = 0;   
  56.          
  57.       if((fcntl(fd, F_SETLKW, &lock)) == -1) 
  58.       { 
  59.             printf("set_lock: fcntl error\n"); 
  60.             exit(1); 
  61.       } 
  62.       else 
  63.       { 
  64.                 printf("[%d] set readlock From %d To %d\n", getpid(), start, len); 
  65.       } 
  66.           
  67.  
  68.  
  69. void set_write_lock(int fd,int start,int len) 
  70.       printf("set_write_lock------\n");  
  71.        
  72.       struct flock lock; 
  73.       lock.l_type = F_WRLCK; 
  74.       lock.l_start = start; 
  75.       lock.l_whence = SEEK_SET; 
  76.       lock.l_len = len;   
  77.          
  78.       if((fcntl(fd, F_SETLKW, &lock)) == -1) 
  79.       { 
  80.             printf("set_lock: fcntl error\n"); 
  81.             exit(1); 
  82.       } 
  83.       else 
  84.       { 
  85.                 printf("[%d] set writelock From %d To %d\n", getpid(), start, len); 
  86.       }       
  87.  
  88. bool unlock(int fd,int start,int len) 
  89.       printf("unlock------\n"); 
  90.       struct flock lock;      
  91.       lock.l_type = F_UNLCK; 
  92.       lock.l_start = start; 
  93.       lock.l_whence = SEEK_SET; 
  94.       lock.l_len = len; 
  95.      
  96.       if((fcntl(fd, F_SETLK, &lock)) == -1) 
  97.       { 
  98.             printf("1-unlock: fcntl error\n"); 
  99.             exit(1); 
  100.       } 
  101.        printf("unlock [%d~%d]\n",start,len);   

 


makefile

 

  1. srcs=$(wildcard *.c) 
  2. objs =$(patsubst %c,%o,$(srcs)) 
  3. CC = gcc 
  4. Target = main 
  5.  
  6. #################### 
  7.  
  8. .PHONY: all clean # command: make all or make clean 
  9.  
  10. clean:  
  11.     rm -f $(obj) main *~ *gch 
  12.      
  13.      
  14. ################### 
  15. all: $(Target) 
  16.  
  17. $(Target):$(objs) 
  18.     $(CC) -o $@ $^ 
  19. main.o:main.c  
  20.     $(CC) -c $< 
  21. tool0.o:tool0.c  
  22.     $(CC) -c $< 
  23. tool1.o:tool1.c  
  24.     $(CC) -c $< 

 

附件:http://down.51cto.com/data/2362130

文章题目:unix高级IO文件锁
本文网址:http://scyanting.com/article/jocded.html