溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

unix 高級(jí)IO 文件鎖

發(fā)布時(shí)間:2020-06-02 16:30:43 來(lái)源:網(wǎng)絡(luò) 閱讀:689 作者:xieyihua 欄目:系統(tǒng)運(yùn)維

1. 注意fcntl()參數(shù)cmd 的正確使用 

F_GETFL 用于測(cè)試鎖使用

F_SETFL 無(wú)阻塞設(shè)置鎖 fcntl()會(huì)嘗試幾次后,如果失敗直接返回-1

F_SETLKW 阻塞設(shè)置鎖 fcntl()會(huì)嘗試后,如果失敗會(huì)被系統(tǒng)掛起來(lái),直到收到解鎖的信號(hào)再去執(zhí)行

2. 測(cè)試鎖的時(shí)候 struct flock lock結(jié)構(gòu)體成員 中的l_stype 需要設(shè)置為F_WRLCK 其它F_UNLCK,F_RDLCK會(huì)有問(wèn)題

3.struct flock lock 成員使用

測(cè)試或鎖 整個(gè)文件怎樣設(shè)置

l_whence = SEEK_SET

l_start = 0;

l_len = 0; 如果l_len為0 表示 從start 開(kāi)始一直到文件最后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.程序自己測(cè)試自己的鎖, 測(cè)試后肯定是無(wú)鎖狀態(tài)

6.程序如果設(shè)置的兩個(gè)區(qū)間 連續(xù)而且鎖的性質(zhì)一樣,系統(tǒng)會(huì)自動(dòng)地將兩個(gè)鎖合并成一個(gè)鎖

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

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



執(zhí)行結(jié)果: 

unix 高級(jí)IO 文件鎖

在另一個(gè)終端執(zhí)行

unix 高級(jí)IO 文件鎖


main.c

  1. #include"setlock.h" 
  2. #include<stdio.h
  3. #include <sys/types.h> 
  4. #include <sys/stat.h> 
  5. #include <fcntl.h
  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 <unistd.h
  2. #include <fcntl.h
  3. #include<stdio.h
  4. #include<stdlib.h
  5. #include <sys/types.h> 
  6. #include<stdbool.h
  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
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI