文件锁
文件锁是一种专为文件I/O设计的一种同步技术,当多个进程在无同步下对文件进行I/O操作时,可能会导致竞争的出现
文件锁的使用步骤通常如下
- 给文件加锁
- 执行文件I/O
- 解锁文件使得其他进程能够给文件加锁
stdio缓冲与加锁
在使用文件锁时需要注意stdio缓冲区的问题
在给文件加锁之前,缓冲区中可能包含我们不希望拥有的值,当在释放锁之后,缓冲区中内容的也可能会被无意写入文件,对此有以下几种办法
- 使用read(),write())系统调用替代stdio()函数
- 对文件加锁后,释放前都立即刷新stdio缓冲区
- 使用setbuf(NULL)禁用缓冲
1.使用flock()给文件加锁
#include<sys/file.h>
int flock(int fd, int operation);
//成功: 返回0 失败:返回-1
参数解释
-
fd
指定加锁的文件的文件描述符
-
operation
operation可以有如下取值,支持OR
值 描述 LOCK_SH 在fd引用的文件上放置一把共享锁 LOCK_EX 在fd引用的文件上放置一把互斥锁 LOCK_UN 解锁fd引用的文件 LOCK_NB 发起一个非阻塞的锁请求
互斥锁与共享锁
在任一时刻,任意数量的进程可同时持有一个文件上的共享锁,但在同一时刻,只能有一个进程持有同一个文件上的互斥锁,如表
锁粒度
flock()会在整个文件上加锁,即它的加锁粒度是整个文件
<