Linux檔案鎖簡介


簡介

檔案鎖是一種機制,用於一次僅限制一個程序或使用者訪問檔案。在多使用者系統中,當多個程序嘗試同時訪問同一個檔案時,它對於避免衝突至關重要。在Linux中,檔案鎖是透過使用鎖來實現的。鎖可以防止其他程序訪問檔案,直到鎖被釋放。

在本文中,我們將探討Linux中的檔案鎖以及如何使用C程式碼實現它。我們將討論不同型別的檔案鎖,如何建立和釋放鎖,以及如何在鎖定過程中處理可能出現的錯誤。

檔案鎖的型別

在Linux中,有兩種型別的檔案鎖:

  • 建議鎖

  • 強制鎖。

使用fcntl()實現建議鎖

建議鎖是允許程序請求對檔案的鎖定,但它們並不阻止其他程序訪問或修改檔案的檔案鎖。當多個程序需要訪問一個檔案,但每個程序都需要確保它對檔案的特定部分具有獨佔訪問許可權時,建議鎖非常有用。

fcntl()函式用於設定檔案的建議鎖。fcntl()函式可以用來獲取對檔案特定部分或整個檔案的鎖。下面的程式碼示例演示瞭如何使用fcntl()函式設定檔案的建議鎖:

示例

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
   int fd = open(argv[1], O_RDWR);
   struct flock fl;
   fl.l_type = F_WRLCK; // Set a write lock
   fl.l_whence = SEEK_SET; // Start at beginning of file
   fl.l_start = 0; // Offset from beginning of file
   fl.l_len = 0; // Lock entire file
   fl.l_pid = getpid(); // Set process ID
   fcntl(fd, F_SETLKW, &fl); // Set the lock
   printf("File locked
"); sleep(10); // Sleep for 10 seconds fl.l_type = F_UNLCK; // Release the lock fcntl(fd, F_SETLK, &fl); // Unlock the file printf("File unlocked
"); close(fd); return 0; }

上面的程式碼對命令列引數指定的文 件設定寫鎖。使用F_SETLKW標誌呼叫fcntl()函式來獲取鎖。然後,該程序休眠10秒鐘以模擬對檔案進行的一些操作。最後,使用F_SETLK標誌釋放鎖。

cd Desktop/
$  touch filename.c
$ gcc filename.c -o test
$ ./test

輸出

File locked
File unlocked

強制鎖的實現

強制鎖是防止其他程序訪問或修改檔案直到鎖被釋放的檔案鎖。強制鎖由核心設定,程序無法覆蓋。當檔案至關重要且不得被任何其他程序修改時,強制鎖非常有用。

fcntl()函式也用於設定檔案的強制鎖。F_SETLK標誌用於設定檔案的強制鎖。下面的程式碼示例演示瞭如何使用fcntl()函式設定檔案的強制鎖:

示例

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
   int fd = open(argv[1], O_RDWR);
   struct flock fl;
   fl.l_type = F_WRLCK; // Set a write lock
   fl.l_whence = SEEK_SET; // Start at beginning of file
   fl.l_start = 0; // Offset from beginning of file
   fl.l_len = 0; // Lock entire file
   fl.l_pid = getpid(); // Set process ID
   fcntl(fd, F_SETLK, &fl); // Set the lock
   printf("File locked
"); sleep(10); // Sleep for 10 }

輸出

File locked
File unlocked

Linux系統中的所有鎖

檢視Linux系統中所有鎖的方法有兩種:

  • lslocks命令

  • cat /proc/locks

使用lslocks命令

在使用lslocks命令之前,讓我們瞭解一下lslocks命令的工作原理。透過lslocks命令,您可以檢視Linux系統中當前的所有檔案鎖。

$ lslocks
COMMAND          PID   TYPE   SIZE  MODE    M   START       END             PATH
 cron            752   FLOCK        WRITE   0     0          0              /run...
 nautilus        2164  POSIX  3.9M  READ    0 1073741826  1073742335     /home/papan/.cache/tracker/meta.db
 nautilus        2164  POSIX  32K   READ    0    128         128               /home/papan/.cache/tracker/meta.db-shm
 whoopsie        955   FLOCK        WRITE   0     0           0                                          /run/lock...
  snapd          787   FLOCK        WRITE   0     0           0              /...
tracker-miner-f  1480  POSIX  3.9M  READ    0 1073741826  1073742335 /home/papan/.cache/tracker/meta.db
tracker-miner-f  1480  POSIX  32K   READ    0    128         128                /home/papan/.cache/tracker/meta.db-shm
update-notifier  2049  FLOCK        WRITE   0     0           0                            /run/user/1000/update-notifier.pid

上面的列表顯示了系統中當前被鎖定的檔案的資訊,包括鎖的型別、檔案路徑以及負責持有鎖的程序。

使用cat /proc/lock

除了在我們的程式中使用flock系統呼叫外,我們還可以使用/proc/locks檔案檢視當前在Linux作業系統中對檔案持有的鎖。/proc/locks檔案是一個虛擬檔案系統,它提供有關係統中對檔案持有的鎖的資訊。

要檢視/proc/locks檔案的內容,我們可以簡單地在文字編輯器中開啟它,或者在終端中使用cat命令:

$ cat /proc/locks
1: FLOCK  ADVISORY  WRITE  2049    00:37:94       0        EOF
2: POSIX  ADVISORY  READ   1480  08:05:280388    128       128
3: POSIX  ADVISORY  READ   1480  08:05:280384 1073741826 1073742335
4: FLOCK  ADVISORY  WRITE   787  08:05:703530     0        EOF
5: FLOCK  ADVISORY  WRITE   955     00:1b:5       0        EOF
6: FLOCK  ADVISORY  WRITE   752    00:19:1123     0        EOF

結論

檔案鎖是Linux中一項關鍵機制,有助於防止資料損壞並確保多程序環境中的資料一致性。在本文中,我們探討了Linux中檔案鎖的基礎知識,包括不同型別的鎖、如何在C程式中使用檔案鎖以及如何使用lslocks命令檢視有關檔案鎖的資訊。

更新於:2023年3月29日

3K+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.