Linux中的兩種檔案鎖 協同鎖與強制鎖

2021-06-06 01:22:06 字數 2606 閱讀 3204

檔案鎖是一種檔案讀寫機制,在任何特定的時間只允許乙個程序訪問乙個檔案。利用這種機制能夠使讀寫單個檔案的過程變得更安全。

在這篇文章中,我們將**linux中不同型別的檔案鎖,並通過示例程式來理解它們之間的不同之處。

我們將採取以下的例子來解釋為什麼需要使用檔案鎖。

1、  程序「a」開啟和讀取乙個檔案,此檔案包含賬戶相關的一些資訊。

2、  程序「b」也開啟了這個檔案,並讀取了檔案中的資訊。

3、  現在,程序「a」更改了其副本中的一條餘額記錄,並將其寫入檔案。

4、  此時,程序「b」並不知道上次讀取的檔案已經被更改,它還儲存著原始的檔案副本。然後,程序「b」更改了「a」操作的那條相同的記錄,並將記錄寫入檔案。

5、  此時,檔案中將只儲存了程序「b」更改過的記錄。

為了避免這種事情發生,就要使用檔案鎖來確保操作的「序列化」。

以下是linux系統中兩種常用的檔案鎖:

1、  協同鎖

2、  強制鎖

1、  協同鎖

協同鎖要求參與操作的程序之間協同合作。假設程序「a」獲得乙個write鎖,並開始向檔案中寫入內容;此時,程序「b」並沒有試圖獲取乙個鎖,它仍然可以開啟檔案並向檔案中寫入內容。在此過程中,程序「b」就是乙個非合作程序。如果程序「b」試圖獲取乙個鎖,那麼整個過程就是乙個合作的過程,從而可以保證操作的「序列化」。

只有當參與操作的程序是協同合作的時候,協同鎖才能發揮作用。協同鎖有時也被稱為「非強制」鎖。

2、  強制鎖

強制鎖不需要參與操作的程序之間保持協同合作。它利用核心來查檢每個開啟、讀取、寫入操作,從而保證在呼叫這些操作時不違反檔案上的鎖規則。關於強制鎖的更多資訊,可以在kernal.org

上找到。

為了使能linux中的強制鎖功能,你需要在檔案系統級別上開啟它,同時在單個檔案上開啟它。其步驟是:

1、  掛載檔案系統時使用「-o mand」引數。

2、  對於要開啟強制鎖功能的檔案lock_file,必須開啟set-group-id位,關閉group-execute位。(選擇此方法的原因是,當你關閉group-execute時,設定set-group-id就沒有實際的意義了)

linux檔案鎖的示例

為了理解檔案鎖是如何工作的,我們建立程式檔案file_lock.c:

#include #include int main(int argc, char **argv) 

static struct flock lock;

lock.l_type = f_wrlck;

lock.l_start = 0;

lock.l_whence = seek_set;

lock.l_len = 0;

lock.l_pid = getpid();

int ret = fcntl(fd, f_setlkw, &lock);

printf("return value of fcntl:%d\n",ret);

if(ret==0) }}}

用gcc編譯此程式:

# cc -o file_lock file_lock.c
使用mount命令帶「mand」引數來重新掛載根檔案系統,如下所示。這將在檔案系統級別使能強制鎖功能。注意:你必須切換到root使用者才能執行下面的命令。

# mount -oremount,mand /
在可執行的(file_lock所在的)目錄中建立兩個名為「advisory.txt」和「mandatory.txt」的檔案。對於「mandatory.txt」使能set-group-id,同時不使能group-execute-bit,如下所示:

# touch advisory.txt

# touch mandatory.txt

# chmod g+s,g-x mandatory.txt

測試協同鎖:執行示例程式,以「advisory.txt」作為引數。

# ./file_lock advisory.txt
此程式將等待使用者的輸入。從另乙個終端或控制台,嘗試輸入以下命令列:

# ls >>advisory.txt
在上面的例子中,ls命令會將其輸出寫入到advisory.txt檔案中。即使我們獲得了乙個寫入鎖,仍然會有一些程序(非合作)能夠往檔案裡寫入資料。這就是所謂的「協同」鎖。

測試強制鎖:再次執行示例程式,以「mandatory.txt」作為引數。

# ./file_lock mandatory.txt
從另乙個終端或控制台,嘗試輸入以下命令列:

# ls >>mandatory.txt
在上面的例子中,ls命令在將其輸出寫入到mandatory.txt檔案之前,會等待檔案鎖被刪除。雖然它仍然是乙個非合作程序,但強制鎖起了作用。

英文原文:lakshmanan ganapathy    編譯:肖翔

Linux下面的兩種檔案鎖

檔案鎖是一種檔案讀寫機制,在任何特定的時間只允許乙個程序訪問乙個檔案。利用這種機制能夠使讀寫單個檔案的過程變得更安全。在這篇文章中,我們將 linux中不同型別的檔案鎖,並通過示例程式來理解它們之間的不同之處。我們將採取以下的例子來解釋為什麼需要使用檔案鎖。1 程序 a 開啟和讀取乙個檔案,此檔案包...

檔案鎖中的「協同鎖」與「強制鎖」的區別

檔案鎖是一種檔案讀寫機制,在任何特定的時間只允許乙個程序訪問乙個檔案。利用這種機制能夠使讀寫單個檔案的過程變得更安全。在這篇文章 中,我們將 linux 中不同型別的檔案鎖,並通過示例程式來理解它們之間的不同之處。我們將採取以下的例子來解釋為什麼需要使用檔案鎖。1 程序 a 開啟和讀取乙個檔案,此檔...

linux 中的檔案鎖

linux執行多個程序同時對一檔案進行讀寫,雖然每乙個read和write都是原子操作,但核心並沒有在兩個讀寫操作之間加以同步。因此,當乙個程序多次呼叫read讀檔案時,就有可能在某兩次讀之間被另一程序所寫,因此,讀的的值將發生錯誤,造成了檔案資料的隨機性衝突,為解決此類併發程序對共享檔案的訪問控制...