Linux以下的兩種文件鎖


文件鎖是一種文件讀寫機制。在不論什么特定的時間僅僅同意一個進程訪問一個文件。

利用這樣的機制可以使讀寫單個文件的過程變得更安全。

在這篇文章中。我們將探討Linux中不同類型的文件鎖,並通過演示樣例程序來理解它們之間的不同之處。

我們將採取下面的樣例來解釋為什么須要使用文件鎖。

1、  進程“A”打開和讀取一個文件,此文件包括賬戶相關的一些信息。

2、  進程“B”也打開了這個文件。並讀取了文件里的信息。

3、  如今,進程“A”更改了其副本中的一條剩余金額記錄,並將其寫入文件。

4、  此時,進程“B”並不知道上次讀取的文件已經被更改。它還保存着原始的文件副本。

然后。進程“B”更改了“A”操作的那條同樣的記錄,並將記錄寫入文件。

5、  此時。文件里將僅僅保存了進程“B”更改過的記錄。

為了避免這樣的事情發生,就要使用文件鎖來確保操作的“序列化”。

 

下面是Linux系統中兩種經常使用的文件鎖:

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 <stdio.h>
#include <fcntl.h>
 
intmain(intargc, char**argv) {
  if(argc > 1) {
    intfd = open(argv[1], O_WRONLY);
    if(fd == -1) {
      printf("Unable to open the file\n");
      exit(1);
    }
    staticstruct flock lock;
 
    lock.l_type = F_WRLCK;
    lock.l_start = 0;
    lock.l_whence = SEEK_SET;
    lock.l_len = 0;
    lock.l_pid = getpid();
 
    intret = fcntl(fd, F_SETLKW, &lock);
    printf("Return value of fcntl:%d\n",ret);
    if(ret==0) {
      while(1) {
        scanf("%c", NULL);
      }
    }
  }
}

#

 用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文件之前。會等待文件鎖被刪除。盡管它仍然是一個非合作進程。但強制鎖起了作用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM