共享鎖,如果a程序對檔案的某區域加了讀鎖,b程序也可以在此區域加讀鎖,但是不能對此區域加寫鎖。
獨佔鎖,如果a程序對檔案的某個區域加了寫鎖,b程序就不能對此區域加寫鎖,也不能對此區域加讀鎖。
當多個程序同時對乙個檔案進行讀寫操作時,為確保檔案的完整和一致性,這幾個程序要加鎖同步。
當程序開始讀取檔案的某個區域時,先加讀鎖,讀完之後再解鎖。
檔案記錄鎖
1.函式原型:int fcntl (int fd,int cmd,struct flck lock);
引數:fd:檔案描述符;
cmd:功能符號;(f_setlk用來設定或釋放鎖; f_getlk用來獲得鎖資訊;)
lock:儲存鎖資訊的結構體指標;
返回值:呼叫成功返回0,失敗返回-1
2.鎖資訊結構體
struct flock
l_type有f_rdlck讀鎖、f_wrlck寫鎖及f_unlck空鎖。
(!!注意:讀鎖,不會影響資料,可以一直加;但是寫鎖,只能加一次)
l_whence有seek_set、seek_cur和seek_end。
l_len為0時表示從起點開始直至最大可能位置為止。
下面舉個加寫鎖的例子:
#include < stdio.h>
#include < unistd.h>
#include < fcntl.h>
/** int fctnl(int fd,int cmd,struct *lock); //cmd:f_setlk設定或解放鎖;f_getlk獲得鎖資訊;返回值:0-成功,-1-失敗
struct flock;
*/int main()
; if((fd = open("a.txt",o_rdwr)) == -1)
if(fd == -1)
// printf("fd=%d\n",fd);
//判斷是否有鎖
res = fcntl(fd,f_getlk,&lock);
if(res == -1)
if(lock.l_type != f_unlck)
else //上寫鎖,讀鎖可以一直加,寫鎖只能加乙個
//操作檔案
getchar();
//解鎖
lock.l_type = f_unlck;
res = fcntl(fd,f_setlk,&lock);
if(res == -1)
}close(fd);
return 0;
}
關於多個程序上鎖的問題,本質上步驟一樣,後面複習中陸續再更...
Linux C 多程序檔案操作之檔案鎖
flock函式可以鎖定檔案,避免多個程序對同個檔案進行操作時出現資料出錯。flock的用法是在開啟檔案後對檔案讀寫前呼叫flock函式上鎖,檔案操作完後flock解鎖,但需注意另乙個程序操作同個檔案時必須自己去檢查檔案是否已上鎖,即在讀寫檔案前呼叫flock函式即可進行判斷,如果上鎖,該程序則會阻塞...
Linux C 檔案操作
系統呼叫比標準庫移植性差 不同os介面不一定一致 系統呼叫會進入核心態,對程式執行的開銷較大.預設檔案描述符 0 標準輸入 1 標準輸出 2 標準錯誤輸出 include include include include include define maxline 80 void if error ...
Linux C 檔案操作
linux 檔案操作 1 linux檔案操作 1.1 系統呼叫 系統呼叫發生核心空間,因此如果在使用者空間的一般應用程式中使用系統呼叫來進行檔案操作,會有使用者空間到核心空間的開銷。但通過系統呼叫來訪問檔案是最直接的方式,系統呼叫函式直接作用於作業系統核心的裝置驅動程式從而實現檔案訪問。檔案描述符f...