【多用户访问一个文件】文件锁
来源:互联网 发布:手机表白神器软件 编辑:程序博客网 时间:2024/06/06 10:48
1、当多个用户同时访问一个文件的时候,Linux会采取给文件上锁的机制防止共享资源产生竞争状态。于是便有了文件锁的概念。
2、文件锁包括建议性锁和强制性锁。
建议锁要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下内核和操作系统都不使用建议性锁。
3、强制性锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对该文件进行读写操作。但是会损耗性能,每次读写操作都会检查是否有锁存在。
4、实现上锁操作的函数由flock以及fcntl。flock主要是实现建议性锁,但是fcntl除了建议性锁还有强制性锁。同时fcntl还能实现记录锁。记录锁包括读取锁(共享锁)和写入锁(排斥锁)。
5、flock函数
功能:锁定文件或解除锁定文件,只能锁定整个文件,无法锁定文件的某一区域。
原型: int flock(int fd,int operation);
参数:operation
LOCK_SH建立共享锁定。多个进程可同时对同一个文件作共享锁定。
LOCK_EX建立互斥锁定。一个文件同时只有一个互斥锁定。
LOCK_UN解除文件锁定状态。
LOCK_NB无法建立锁定时,此操作可不被阻断,马上返回进程。通常与 LOCK_SH或LOCK_EX做OR(|)组合。
flock()根据调用时operation参数传入LOCK_UN的值来释放一个文件锁。此外,锁会在相应的文件描述符被关闭之后自动释放。同时,当一个文件描述符被复制时(dup()、dup2()、或一个fcntl() F_DUPFD操作),新的文件描述符会引用同一个文件锁。
flock(fd, LOCK_EX);
new_fd = dup(fd);
flock(new_fd, LOCK_UN);
这段代码先在fd上设置一个互斥锁,然后通过fd创建一个指向相同文件的新文件描述符new_fd,最后通过new_fd来解锁。
返回值:返回0表示成功,若有错误则返回-1,错误代码存于errno。
表头文件: #include<sys/file.h>
6、fcntl函数
功能:可以施加建议性锁,还可以施加强制锁。同时,fcntl还能对文件的某一记录进行上锁,也就是记录锁。对整个文件区域加锁
原型:int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
参数:
fd
参数fd代表欲设置的文件描述符。
cmd
参数cmd代表打算操作的指令。有以下的几种情况
F_DUPFD:用来查找大于或等于参数arg的最小且仍未使用的文件描述符,并且复制参数fd的文件描述符。
F_GETFD:取得close-on-exec旗标。若此旗标的FD_CLOEXEC位为0,代表在调用exec()相关函数时文件将不会关闭。
F_SETFD 设置close-on-exec 旗标。该旗标以参数arg的FD_CLOEXEC位决定。
F_GETFL 取得文件描述符状态旗标,此旗标为open()的参数flags。
F_SETFL 设置文件描述符状态旗标,参数arg为新旗标,但只允许O_APPEND、O_NONBLOCK和O_ASYNC位的改变,其他位的改变将不受影响。
F_GETLK 取得文件锁定的状态
F_SETLK 设置文件锁定的状态。。此时flcok 结构的l_type值必须是F_RDLCK、F_WRLCK或F_UNLCK。如果无法建立锁定,则返回-1,错误代码为EACCES或EAGAIN。
代码: r = fcntl(fd,F_SETLK,&lk);
if(r == 0) printf("枷锁成功!\n");
else printf("枷锁失败!\n");
- 【多用户访问一个文件】文件锁
- Android 文件断点上传器[多用户并发访问]
- Android文件断点上传器[多用户并发访问]
- java实时监测文件夹的变化,允许多用户同时访问,完成文件转移
- java实时监测文件夹的变化,允许多用户同时访问,完成文件转移
- SVN多用户同时修改一个文件冲突过程分析及解决方法(非用锁方法)
- SVN多用户同时修改一个文件冲突过程分析及解决方法(非用锁方法)
- SVN多用户同时修改一个文件冲突过程分析及解决方法(非用锁方法)
- FCKeditor 多用户文件上传Java版
- 文件访问
- 文件访问
- 访问文件目录,文件
- 在一个页面里这样访问了一个js文件
- 多用户模拟访问站点
- win2008 多用户远程访问
- Openwrt 串口多用户访问
- Openwrt 网页多用户访问
- openvpn 多用户访问
- JQ选择的链式写法
- scrapy的应用
- 2016.10.20-日志
- 基于C#\WPF的UDP网口助手源码
- 解析Json数据的时候抛出MalformedJsonException
- 【多用户访问一个文件】文件锁
- r进行crt预估
- Hive参数
- typedef和#define的用法与区别
- 西南联训5[Source from NK] 题解&总结
- MVD微型机器视觉设备 (Micro Vision Device) ---- 源于OpenMV,超越OpenMV
- 串的堆分配的基本操作
- 大数据量Elastic数据迁移方法及注意事项
- Java中的Final关键字,区分基本数据类型与引用类型,值传递与引用传递