檔案鎖fcntl()函式的使用
問:為什麼要使用檔案鎖?
答:當多個使用者共同使用、操作一個檔案的情況時,Linux採用的方法就是給檔案上鎖,來避免共享的資源產生競爭的狀態。
問:檔案鎖有哪些型別?
答:檔案鎖包括建議性鎖和強制性鎖。一般情況下,核心和系統都不適用建議性鎖,採用強制性鎖的影響很大,每次讀寫操作都必須檢查是否有所存在。
問:怎樣實現檔案上鎖?
答:在Linux中,實現檔案上鎖的函式有lockf() 和fcntl() ,其中lockf()用於對檔案施加建議性鎖,而fcntl() 不僅可以施加建議性鎖,而且可以施加強制性鎖。fcntl()還能對檔案的某一記錄上鎖,也就是記錄鎖。記錄鎖又可分讀取鎖(共享鎖)和寫入鎖(排斥鎖),檔案的同一部分不能同時建立讀取鎖和寫入鎖。
fcntl()使用例項:
檔案記錄鎖功能原始碼:
- /*
- * lock_set.c
- *
- * Created on: 2012-7-17
- * Author: liwei.cai
- */
- int lock_set(int fd, int type)
- {
- struct flock old_lock, lock;
- lock.l_whence = SEEK_SET;
- lock.l_start = 0;
- lock.l_len = 0;
- lock.l_type = type;
- lock.l_pid -1;
- //判斷檔案是否上鎖
- fcntl(fd, F_GETLK, &lock);
- if (lock.l_type != F_UNLCK)
- {
- //判斷檔案不能上鎖的原因
- if (lock.l_type == F_RDLCK) //該檔案已有讀取鎖
- {
- printf("Read lock already set by %d .\n", lock.l_pid);
- }
- else if(lock.l_type == F_WRLCK) //該檔案已有寫入鎖
- {
- printf("Write lock already set by %d .\n", lock.l_pid);
- }
- }
- //l_type 可能已被F_FETLK修改過
- lock.l_type = type;
- //根據不同的type值進行阻塞式上鎖或解鎖
- if((fcntl(fd, F_SETLKW, &lock)) < 0)
- {
- printf("Lock failed:type = %d\n", lock.l_type);
- return 1;
- }
- switch(lock.l_type)
- {
- case F_RDLCK:
- {
- printf("Read lock set by %d \n", getpid());
- }
- break;
- case F_WRLCK:
- {
- printf("Write lock set by %d \n", getpid());
- }
- break;
- case F_UNLCK:
- {
- printf("Release lock by %d \n", getpid());
- return 1;
- }
- break;
- default:
- break;
- }
- return 0;
- }
檔案寫入鎖的測試用例,這裡首先建立了一個“hello”檔案,之後對其上寫入鎖,最後釋放寫入鎖。
- /*
- * write_lock.c
- *
- * Created on: 2012-7-17
- * Author: liwei.cai
- */
- #include <unistd.h>
- #include <sys/file.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include "lock_set.c"
- int main()
- {
- int fd;
- //首先開啟檔案
- fd = open("hello", O_RDWR|O_CREAT, 0644);
- if (fd < 0)
- {
- printf("Open file error!\n");
- exit(1);
- }
- //給檔案上寫入鎖
- lock_set(fd, F_WRLCK);
- getchar();
- //給檔案解鎖
- lock_set(fd, F_UNLCK);
- getchar();
- close(fd);
- exit(0);
- }
讀取鎖與寫入鎖類似。
- /*
- * fcntl_read.c
- *
- * Created on: 2012-7-17
- * Author: liwei.cai
- */
- #include <unistd.h>
- #include <sys/file.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include "lock_set.c"
- int main()
- {
- int fd;
- //首先開啟檔案
- fd = open("hello", O_RDWR|O_CREAT, 0644);
- if (fd < 0)
- {
- printf("Open file error!\n");
- exit(1);
- }
- //給檔案上寫入鎖
- lock_set(fd, F_RDLCK);
- getchar();
- //給檔案解鎖
- lock_set(fd, F_UNLCK);
- getchar();
- close(fd);
- exit(0);
- }
相關文章
- 第七篇:使用 fcntl 函式 獲取,設定檔案的狀態標誌函式
- fcntl函式實現dup函式
- fcntl函式用法詳解函式
- Linux系統程式設計(3)——檔案與IO之fcntl函式Linux程式設計函式
- fcntl.h標頭檔案
- 用fcntl()設定阻塞函式的阻塞性質函式
- 在LoadRunner中使用檔案的相關函式函式
- fcntl.h與unistd.h標頭檔案
- 檔案處理函式函式
- 輕輕鬆鬆找檔案--支援回撥函式的通用檔案查詢函式 (轉)函式
- PHP flock 檔案鎖的使用問題PHP
- 簡單的檔案快取函式快取函式
- 檔案檢測函式 feof, ferror,clearerr C庫函式函式Error
- algorithm標頭檔案下的常用函式Go函式
- C++ 的函式分檔案編寫C++函式
- asp 中常用的檔案處理函式函式
- 檔案鎖
- 第九篇:使用 lstat 函式獲取檔案資訊函式
- Nt函式原型標頭檔案函式原型
- 各類檔案管理函式 (轉)函式
- C語言fgetc()函式:讀檔案函式(由檔案中讀取一個字元)C語言函式字元
- localtime函式的死鎖風險函式
- 檢測真實的檔案型別函式型別函式
- 讀寫INI檔案的四個函式 (轉)函式
- 函式:file.move 移動檔案函式
- C語言putc()函式:寫檔案函式(將一指定字元寫入檔案中)C語言函式字元
- 場景實踐:使用函式計算打包下載OSS檔案函式
- 第五篇:使用無緩衝IO函式讀寫檔案函式
- BIEE 儲存本地自定義檔案並通過fmap函式使用函式
- 淺談ASP.NET中檔案下載函式使用方法ASP.NET函式
- 函式: 函式是怎麼使用的?函式
- php獲取遠端檔案內容的函式PHP函式
- MFC檔案複製的函式程式程式碼 (轉)函式
- C語言fputc()函式:寫檔案函式(將一指定字元寫入檔案流中)C語言函式字元
- Api函式列表——與檔案相關 (轉)API函式
- dup函式:複製檔案描述符函式
- 開發函式計算的正確姿勢——使用 brotli 壓縮大檔案函式
- 在Visual C++中使用fopen()函式來讀寫檔案 (轉)C++函式