Linux 中的文件锁定简介Linux 中的文件锁定简介Linux 中的文件锁定简介Linux 中的文件锁定简介
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

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 命令查看有关文件锁定的信息。

©2015-2025 艾丽卡 support@alaica.com