Linux下面的兩種檔案鎖

2021-06-27 00:20:07 字數 2441 閱讀 2484

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

在這篇文章中,我們將**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 #include intmain(intargc, char**argv) 

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)

}}}

#

用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檔案之前,會等待檔案鎖被刪除。雖然它仍然是乙個非合作程序,但強制鎖起了作用。

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

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

linux下面的檔案處理

1 檔案在windows和linux下面進行傳輸時,需要用到ftp服務。可以用乙個操作很方便的工具filezila實現跨平台的檔案傳輸 2 如果想在自己的機器上連上遠端的linux伺服器,可以用putty客戶端進行連線。當然,連線linux系統的客戶端還有很多。3 檔案在linux下面進行傳輸時可以...

介面的兩種模式

模型一 防盜門模型 乙個類直接去實現父類和多種介面。介面 鎖 public inte ce lock 抽象類 door public abstract class door 防盜門繼承door 實現鎖 public class theftproofdoor extends door implemen...