在 Linux 下,“文件锁”通常有两种常见含义,分别用于不同场景。下面我按使用频率和方式给你系统讲一下。
# 独占锁,若已被锁则等待
flock -x /tmp/lock.lock -c "echo running; sleep 10"
# 非阻塞(拿不到锁直接退出)
flock -xn /tmp/lock.lock -c "echo running"
常用参数:
-x / -e:排他锁(写锁)-s:共享锁(读锁)-n:非阻塞-w:等待超时时间✅ 适合:防止脚本重复执行
#include <sys/file.h>
int fd = open("test.lock", O_CREAT | O_RDWR, 0666);
flock(fd, LOCK_EX); // 加排他锁
// do something
flock(fd, LOCK_UN); // 解锁
特点:
#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); // 阻塞加锁
✅ 适合:多进程并发访问文件不同区域
#include <unistd.h>
lockf(fd, F_LOCK, 0); // 锁整个文件
fcntl| 方式 | 粒度 | 跨进程 | 建议 |
|---|---|---|---|
| flock | 整个文件 | ✅ | ✅ 脚本/简单程序 |
| fcntl | 字节范围 | ✅ | ✅ 精细控制 |
| lockf | 整个文件 | ✅ | ❌ 不推荐 |
如果你告诉我:
我可以直接给你对应的最佳示例。