[11]APUE:(文件)记录锁
[a] 概念
- 建议锁:在遵循相同记录锁规则的进程/线程间生效,通常用于保证某个程序自身多个进程/线程间的数据一致性
- 强制锁:意在保证所有进程间的数据一致性,但不一定有效;如不能应对先 unlink 后建立同名副本的行为
[b] fcntl
#include <fcntl.h>
int fcntl(int fd, int cmd, struct flock *flockp) //出错返回 -1
struct flock {
short l_type; //锁类型:F_RDLCK / F_WRLCK / F_UNLCK
short l_whence; //偏移基准:SEEK_SET / SEEK_CUR / SEEK_END
off_t l_start; //相对于 l_whence 的偏移量(byte)
off_t l_len; //加锁区域的长度(byte)
pid_t l_pid; //仅对 F_GETLK 有意义,获取当前拥有锁的进程 ID
}
- 操纵记录锁时,fcntl 的第三个参数是一个指向 flock 结构体的指针
- cmd 可以为 F_GETLK / F_SETLK / F_SETLKW,分别用于获取文件的锁状态、设置锁(非阻塞)、设置锁(阻塞)
- struct flock 中 l_len 字段若设置为 0,表示区段范围动态扩展至文件末尾, 如加锁之后在文件末尾追加的任何数据将被锁定,若设置为 -1,表示 l_start 之前的所有数据;l_type 字段设置为 F_UNLCK 时用于清除指定的锁
- 同一进程对同一文件的同一区段重复加锁,新锁会取代旧锁,旧锁即时失效
- 执行 F_GETLCK 时,目前的锁状态信息会被写入 flock 结构体中
[c] 死锁
- 两个进程相互等待对方持有的锁且不释放自己锁定的资源时,会形成死锁
- 现代的操作系统会自动解开死锁,通常是使其中一个进程的出错返回,而另一个进程成功获得锁,但不能确定一定是哪个进程获得锁
[d] 锁的隐含继承和释放
- 进程终止时,其所建立的锁会全部释放
- 当多个文件描述符关联到同一个文件时,其中任何一个文件描述符关闭,将会导致锁被释放
- fork 之后的子进程不继承父进程的锁,exec 之后的进程继承原进程的锁(若设置了 close-on-exec 标志,则不继承)
[e] 在文件末尾加锁
- 由于文件末尾的位置会随着追加数据而变化,故解锁时需要注意指定正确的范围
[f] 锁的组合与分裂
- 若对两个已加锁的区段中间的部分全部加锁,则此三部分会组合成一个锁
- 若对已经加锁的区段中间的一部分进行解锁,则原锁会被自动分裂为两个锁
[11]APUE:(文件)记录锁的更多相关文章
- [apue] 使用文件记录锁无法实现父子进程交互执行同步
父子进程间交互执行是指用一种同步原语,实现父进程和子进程在某一时刻只有一个进程执行,之后由另外一个进程执行,用一段代码举例如下: SYNC_INIT(); , counter=; pid_t pid ...
- linux 文件记录锁详解
一: linux记录锁更恰当的称呼应该是范围锁,它是对文件某个范围的锁定. 关于记录锁的功能就是fcntl提供的第五个功能,具体使用如下: int fcntl(int fd, int cmd, str ...
- [21]APUE:线程同步之记录锁(文件)
[a] 概念 建议锁:在遵循相同记录锁规则的进程/线程间生效,通常用于保证某个程序自身多个进程/线程间的数据一致性 强制锁:意在保证所有进程间的数据一致性,但不一定有效:如不能应对先 unlink 后 ...
- APUE 文件IO
文件 IO 记录书中的重要知识和思考实践部分 Unix 每个文件都对应一个文件描述符(file descriptor),为一个非负整数,一个文件可以有多个fd, 后面所有与文件(设备,套接字等)有关操 ...
- 非阻塞io与记录锁
非阻塞io 1.对比 阻塞io的例子:scanf从终端获取输入时,如果不输入程序就会一直停在那; 对一个已经有写锁的文件请求读时, 会一直空等直到前面的进程释放锁... 非阻塞的例子:读取文件内容, ...
- 高级I/O之记录锁
若两个人同时编辑一个文件,其后果将如何呢?在很多UNIX系统中,该文件的最后状态取决于写该文件的最后一个进程.但是对于有些应用程序(例如数据库),进程有时需要确保它正在单独写一个文件.为了向进程提供这 ...
- Linux进程同步之记录锁(fcntl)
记录锁相当于线程同步中读写锁的一种扩展类型,可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步,通过fcntl函数来执行上锁操作.尽管读写锁也可以通过在共享内存区来进行进程的同步,但是fcntl记 ...
- [APUE] 文件 I/O
文件操作相关 API:open, read, write, lseek, close. 多进程共享文件的相关 API:dup, dup2, fcntl, sync, fsync, ioctl. 文件操 ...
- fcntl记录锁实例
fcntl 函数是一个相当常用的对文件进行加锁操作的函数. 文件锁包括强制锁.建议锁.记录锁, 不过一般系统和内核都是用的强制锁. 以下为记录锁的例子:------------------------ ...
随机推荐
- ThinkPHP单字母函数(快捷方法)使用总结
在ThinkPHP中有许多使用简便的单字母函数(即快捷方法),可以很方便开发者快速的调用,但是字母函数却不方便记忆,本文将所有的字母函数总结一下,以方便以后查找. 1.U() URL组装 支持不同UR ...
- php下载网络图片到服务器
/** * 下载二维码到服务器 * @param string $url 图片路径 * @param string $filestring 要保存的文件名 */ private function ...
- ubuntu使用 服务
在这里写了很多篇linux,习惯了在这里写 centos中定时任务命令是crond ubuntu中定时任务命令是cron 这两种linux系统不一样的地方还是挺多的, 既然我目前的专注点是ubuntu ...
- 【转】关于LinQ的动态Or查询
/// <summary> /// 构造函数使用True时:单个AND有效,多个AND有效:单个OR无效,多个OR无效:混合时写在AND后的OR有效 /// 构造函数使用False时:单个 ...
- 2016 ICPC China-Final 现场赛总结
距离比赛结束快有一个礼拜了才抽出时间来写这篇总结.今年比赛打了也有5场了(4场区域赛+1场省赛),也取得了不错的成绩(区域赛两银),总的来说第一年就取得这成绩还是挺高兴的.我们队,我自己都渐渐的趋于成 ...
- eclipse安装svn和maven插件以及m2e-extras
相关介绍: 1.SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Su ...
- socket选项总结(setsocketopt)
功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项, ...
- R随笔(2)
1,查看R中的变量模式(对象的数据类型)mode() 2,因子(factor), table()可以获取多个因子的交叉表,可以知道每个因子出现的次数 > g<-c("f&quo ...
- 学习笔记-----Android的View绘制过程
边看源码边参考别人的博客等,做一下学习笔记. 要了解View的绘制,首先得知道View树的结构:(可以参考http://blog.csdn.net/qinjuning/article/details/ ...
- JQuery源码解析--callbacks
(function (global, factory) { factory(global); })(this, function (window, noGlobal) { var rootjQuery ...