檔案鎖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函式
- 簡單的檔案快取函式快取函式
- PHP flock 檔案鎖的使用問題PHP
- algorithm標頭檔案下的常用函式Go函式
- C++ 的函式分檔案編寫C++函式
- 函式:file.move 移動檔案函式
- url_for函式與靜態檔案函式
- localtime函式的死鎖風險函式
- 場景實踐:使用函式計算打包下載OSS檔案函式
- 05-python函式進階和檔案Python函式
- string.h標頭檔案(字串函式)字串函式
- Python中open函式怎麼操作檔案Python函式
- 開發函式計算的正確姿勢——使用 brotli 壓縮大檔案函式
- 函式: 函式是怎麼使用的?函式
- 函式指標、回撥函式、動態記憶體分配、檔案操作函式指標記憶體
- 標頭檔案包含方式,main函式的引數解析AI函式
- SparkSQL -- 02 【SparkSQL檔案的讀取與落地,和Hive的整合,內建函式,自定義函式】SparkSQLHive函式
- 字串 reverse(str.begin(),str.end()) 函式的標頭檔案 以及 str.clear()函式字串函式
- 巨集_變數_函式_指標_標頭檔案變數函式指標
- Shell 函式的使用函式
- Thunk函式的使用函式
- Generator 函式的使用函式
- 【實戰教程】使用雲函式將資料表匯出為 Excel 檔案函式Excel
- proc_create_data函式建立/proc/目錄下的檔案函式
- Laravel 定時任務,避免重複的方法-----使用檔案鎖Laravel
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- C++ 字元處理函式(cctype標頭檔案)C++字元函式
- Microsoft Visual Studio VS dumpbin使用檢視.obj、.lib、.dll、.exe檔案頭、段函式ROSOBJ函式
- 分散式鎖-Redission-Lock鎖的使用與原理分散式Redis
- 類的方法,函式,同一個package不同.py檔案,不同package不同.py檔案————呼叫問題函式Package
- php函式入門學習(陣列常見函式2 & 檔案基礎讀寫)PHP函式陣列
- 高階函式的使用函式
- tap函式的日常使用函式
- python函式的基本使用Python函式
- 第五篇 匿名函式、內建函式、import的使用、包的使用函式Import
- 分散式檔案系統之MogileFS的安裝使用分散式
- Redisson分散式鎖的簡單使用Redis分散式
- C++標頭檔案<algorithm>中常用函式簡介C++Go函式