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 系统中的所有锁
伊斯洛克命令
猫 /proc/锁
使用 Islocks 命令
在使用 Islocks 命令之前,让我们先了解 Islocks 命令的工作原理。因此,借助 Islocks 命令,您可以查看 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 命令查看有关文件锁定的信息。