中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

unix 高級IO 文件鎖

發布時間:2020-06-02 16:30:43 來源:網絡 閱讀:692 作者:xieyihua 欄目:系統運維

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

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<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問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平利县| 祥云县| 莆田市| 锦屏县| 始兴县| 扎兰屯市| 清原| 肥东县| 丹凤县| 彩票| 凤阳县| 台东县| 肥城市| 永济市| 宿州市| 双牌县| 榆林市| 汉阴县| 西贡区| 玛纳斯县| 土默特左旗| 徐水县| 长春市| 鞍山市| 闽清县| 富蕴县| 荣昌县| 南江县| 阳东县| 临泉县| 汽车| 临颍县| 福建省| 西安市| 汶上县| 抚顺市| 新郑市| 科技| 民权县| 富蕴县| 盐池县|