首頁 > 軟體

Linux fcntl函數 建議鎖 強制鎖

2020-06-16 17:27:06

在多個進程存取同一個檔案的時候,我們肯定不希望在一個進程寫入或修改檔案時,另外一個進程也可以修改檔案內容,這樣就亂了,Linux在底層通過加鎖的方式來避免這種檔案,我們可以通過fcntl函數來給檔案上鎖,鎖又分為建議鎖和強制鎖,建議鎖,顧名思義,相對溫柔一些,在對檔案進行鎖操作時,會檢測是否已經有鎖存在,並且尊重已有的鎖,但是另外的進程還可以修改檔案。在一般的情況下,核心和系統都不使用建議鎖。強制性的鎖是由核心執行的鎖,當一個檔案被上鎖進行寫入操作的時候,核心將阻止其他進程對其進行讀寫操作。採取強制性的鎖對效能的影響很大,每次進行讀寫操作都必須檢查是否有鎖存在,fuctl預設是建議鎖,如果想用強制鎖,需要重新掛載mount系統分割區,我們先看看fcntl函數
函數原型
int fcntl(int fd,int cmd,struct flock *lock);
fd為檔案描述符

cmd是一些命令引數

F_GETLK 根據lock引數值,決定是否上檔案鎖

F_SETLK 設定lock引數值的檔案鎖

F_SETLKW 這是 F_GETLK的阻塞版本,在無法獲取鎖時,會進入睡眠狀態

flock是一個結構體
flock結構體的定義如下:

struct flock {
short l_type;
off_t l_start;
short l_whence;
off_t l_len;
pid_t l_pid;
}

l_type有三個選項:
F_RDLCK : 共用鎖,唯讀用
F_WRLCK : 獨占鎖(寫操作鎖)
F_UNLCK : 解除鎖定
l_start 為相對位移量
l_whence 必須是以下幾個值之一( 在 unistd.h 中定義):
SEEK_SET : 檔案開始位置
SEEK_CUR: 檔案當前位置
SEEK_END: 檔案末尾位置

l_len 加鎖的長度 0 為到檔案末尾
l_pid當前檔案操作的進程id號

好了,下面來看一個例子:

我們用一個死迴圈來防止這個進程死掉

這樣這個進程就一直在執行,我們新開一個遠端端,來修改hello.txt這個檔案

我們發現還是可以修改這個檔案,這是因為fcntl函數預設是建議鎖,如果想用強制鎖呢,需要重新mount分割區

我們再來跑一下程式

再在另外一個遠端終端修改hello.txt

我們發現他阻塞在這裡了,也就是暫時不能修改了,這個時候我強制終止前一個進程

再來看另外一個遠端終端

發現已經修改了。

好了,Linux fcntl函數的建議鎖和強制鎖就總結到這裡,如有問題,歡迎指正,謝謝。

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-11/137614.htm


IT145.com E-mail:sddin#qq.com