Linux 文件锁
2016-07-19 15:46
169 查看
摘自: http://blog.csdn.net/zhx6044/article/details/8003728
在文已经共享的情况下如何操作,也就是当多个进程同时操作同一个文件时,我们怎么保证文件数据的正确性。linux通常采用的方法是文件上锁,来避免共享资源的产生竞争状态。
文件锁包括建议性锁和强制性的锁。建议性的,顾名思义,相对温柔一些,在对文件进行锁操作时,会检测是否已经有锁存在,并且尊重已有的锁。在一般的情况下,内核和系统都不使用建议锁。强制性的锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他进程对其进行读写操作。采取强制性的锁对性能的影响很大,每次进行读写操作都必须检查是否有锁存在。
在linux中对文件进行锁操作,可以使用lockf()和fcntl()这两个函数,前者对文件施加建议性锁,后者为两种锁都行。另外fcntl还可以对文件的某一记录上锁。
fcntl使用格式为:
int fcntl(int fd,int cmd,struct flock *lock);
fd为文件描述符,cmd为一些命令参数,flcok结构体用来设置记录锁的具体状态。
fcntl() 对已打开的文件描述符进行操作,并根据命令参数的不同能够执行不同的任务。关于文件锁的几个命令选项如下:
F_GETLK 根据lock参数值,决定是否上文件锁
F_SETLK 设置lock参数值的文件锁
F_SETLKW 这是 F_GETLK的阻塞版本,在无法获取锁时,会进入睡眠状态。
flock结构体的定义如下:
struct flock {
short l_type;
off_t l_start;
short l_whence;
off_t l_len;
pid_t l_pid;
}
l_type有三个选项:
F_RDLCK : 共享锁,只读用
F_WRLCK : 独占锁(写操作锁)
F_UNLCK : 解除锁定
l_start 为相对位移量
l_whence 必须是以下几个值之一( 在 unistd.h 中定义):
SEEK_SET : 文件开始位置
SEEK_CUR: 文件当前位置
SEEK_END: 文件末尾位置
l_len 加锁的长度
l_pid当前文件操作的进程id号
下面是简单的例子
运行结果:
读是可以共享的。
写的例子:
运行结果:
同时写的话,发生竞争,后者不能对文件做写操作,只有当当前的锁解开,后续的才可写文件
版权声明:本文为博主原创文章,未经博主允许不得转载。
在文已经共享的情况下如何操作,也就是当多个进程同时操作同一个文件时,我们怎么保证文件数据的正确性。linux通常采用的方法是文件上锁,来避免共享资源的产生竞争状态。
文件锁包括建议性锁和强制性的锁。建议性的,顾名思义,相对温柔一些,在对文件进行锁操作时,会检测是否已经有锁存在,并且尊重已有的锁。在一般的情况下,内核和系统都不使用建议锁。强制性的锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他进程对其进行读写操作。采取强制性的锁对性能的影响很大,每次进行读写操作都必须检查是否有锁存在。
在linux中对文件进行锁操作,可以使用lockf()和fcntl()这两个函数,前者对文件施加建议性锁,后者为两种锁都行。另外fcntl还可以对文件的某一记录上锁。
fcntl使用格式为:
int fcntl(int fd,int cmd,struct flock *lock);
fd为文件描述符,cmd为一些命令参数,flcok结构体用来设置记录锁的具体状态。
fcntl() 对已打开的文件描述符进行操作,并根据命令参数的不同能够执行不同的任务。关于文件锁的几个命令选项如下:
F_GETLK 根据lock参数值,决定是否上文件锁
F_SETLK 设置lock参数值的文件锁
F_SETLKW 这是 F_GETLK的阻塞版本,在无法获取锁时,会进入睡眠状态。
flock结构体的定义如下:
struct flock {
short l_type;
off_t l_start;
short l_whence;
off_t l_len;
pid_t l_pid;
}
l_type有三个选项:
F_RDLCK : 共享锁,只读用
F_WRLCK : 独占锁(写操作锁)
F_UNLCK : 解除锁定
l_start 为相对位移量
l_whence 必须是以下几个值之一( 在 unistd.h 中定义):
SEEK_SET : 文件开始位置
SEEK_CUR: 文件当前位置
SEEK_END: 文件末尾位置
l_len 加锁的长度
l_pid当前文件操作的进程id号
下面是简单的例子
运行结果:
读是可以共享的。
写的例子:
运行结果:
同时写的话,发生竞争,后者不能对文件做写操作,只有当当前的锁解开,后续的才可写文件
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关文章推荐
- Linux rename命令文件重命名的用法汇总
- Emacs命令快速参考!!
- linux free / top
- vi/ vim 光标移动命令
- Centos ssh登录慢问题的解决办法
- linux namespace
- linux sed 批量替换字符串
- Linux修改ssh远程端口
- 安装centos7.0时电脑进入黑屏的解决方法
- Linux里设置环境变量的方法(export PATH)
- [备注] Linux系统结构 详解
- linux内核input子系统解析
- Linux收藏
- centos yum 安装
- Sed linux命令详解(详细)
- Centos 7U盘安装
- linux下客户端ssh登录失败的解决方法
- proc文件系统介绍
- LVS的介绍与配置
- linux常用基本命令之二十七 service