RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:8:30-17:00
你可能遇到了下面的问题
关闭右侧工具栏

新闻中心

这里有您想知道的互联网营销解决方案
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. { 
  10.       int fd = open("./src", O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IXOTH); 
  11.        
  12.       check_lock(fd,0,10); 
  13.       check_lock(fd,11,20); 
  14.  
  15.       set_read_lock(fd,0,10); 
  16.       set_write_lock(fd,11,20); 
  17.        
  18.       sleep(15); 
  19.           
  20.       unlock(fd,0,10); 
  21.       unlock(fd,11,20); 
  22.        
  23.       return 0; 
  24. } 

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

 


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文件锁
URL标题:http://dtcuyxr.com/article/jocded.html