温馨提示×

linux文件锁怎么使用

小樊
42
2026-10-13 10:02:52
栏目: 智能运维

在 Linux 下,“文件锁”通常有两种常见含义,分别用于不同场景。下面我按使用频率和方式给你系统讲一下。


一、flock:整个文件锁(最常用、最简单)

1️⃣ 命令行使用(脚本中很常见)

# 独占锁,若已被锁则等待
flock -x /tmp/lock.lock -c "echo running; sleep 10"

# 非阻塞(拿不到锁直接退出)
flock -xn /tmp/lock.lock -c "echo running"

常用参数:

  • -x / -e:排他锁(写锁)
  • -s:共享锁(读锁)
  • -n:非阻塞
  • -w:等待超时时间

✅ 适合:防止脚本重复执行


2️⃣ C 语言使用

#include <sys/file.h>

int fd = open("test.lock", O_CREAT | O_RDWR, 0666);
flock(fd, LOCK_EX);      // 加排他锁
// do something
flock(fd, LOCK_UN);      // 解锁

特点:

  • 锁的是 整个文件
  • 和进程绑定(进程退出自动释放)
  • 不支持锁文件中的某一部分

二、fcntl:更精细的“记录锁”(POSIX 标准)

1️⃣ 特点

  • 可以锁文件的一部分
  • 支持读锁 / 写锁
  • 更通用(NFS 也支持)

2️⃣ C 示例

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

struct flock lock;
lock.l_type = F_WRLCK;   // F_RDLCK / F_WRLCK / F_UNLCK
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 100;        // 锁前100字节

fcntl(fd, F_SETLKW, &lock);  // 阻塞加锁

✅ 适合:多进程并发访问文件不同区域


三、lockf(不推荐,功能弱)

#include <unistd.h>
lockf(fd, F_LOCK, 0);   // 锁整个文件
  • 基于 fcntl
  • 接口简单但不灵活

四、对比总结

方式 粒度 跨进程 建议
flock 整个文件 ✅ ✅ 脚本/简单程序
fcntl 字节范围 ✅ ✅ 精细控制
lockf 整个文件 ✅ ❌ 不推荐

五、常见坑 ⚠️

  1. flock 不能用于 NFS(老内核)
  2. fork 后子进程继承锁
  3. close 文件描述符会释放锁
  4. dup 也会增加锁引用

如果你告诉我:

  • 用的是 Shell / C / Python / Java
  • 是 防重复执行 还是 并发读写文件

我可以直接给你对应的最佳示例。

0 踩