[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 函数是一个相当常用的对文件进行加锁操作的函数. 文件锁包括强制锁.建议锁.记录锁, 不过一般系统和内核都是用的强制锁. 以下为记录锁的例子:------------------------ ...
随机推荐
- c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...
- Python全栈开发day4
1.python三元运算 实现方法: result = 值1 if 条件 else 值2 例如: 1 2 3 4 #!/bin/env python #-*- coding:utf-8 -*- nam ...
- Sql Server中不常用的表运算符之PIVOT
PIVOT是SQL Server2005新添加的一个表运算符,作用在于将行转为列. 先来看看他的基本语法: 来自http://technet.microsoft.com/zh-cn/library/m ...
- Handlebars模板库浅析
Handlebars模板库简单介绍 Handlebars是JavaScript一个语义模板库,通过对view(模板)和data(ajax请求的数据,一般是json)的分离来快速构建Web模板.它采用& ...
- completed solution matches microsoft sequential workflow tutorial
microsoft sequential workflow tutorial website:http://msdn.microsoft.com/en-us/library/ms734794(v=vs ...
- C#中一种可调用的异常处理方法
之前做异常处理时,感觉很麻烦,每个地方都要写try和catch,在博客园上看到一篇文章http://www.cnblogs.com/artech/archive/2012/10/28/automati ...
- 转自pnljs 委托(Func<int,bool>)
随笔- 147 文章- 0 评论- 16 Func的介绍 经常看到 Func<int, bool>...这样的写法,看到这样的就没有心思看下去了.我们学技术还是需要静下心来. 对Fu ...
- 史航416第11次作业&总结
作业1:冒泡排序 #include <stdio.h> ],int n); int main() { ],n,i; printf("输入一个整数n:"); scanf( ...
- layer弹出层不居中解决方案
layer弹出层不居中解决方案 代码头中加入以下代码即可 <!doctype html>
- CoreSeek
[CoreSeek] CoreSeek有两个核心模块Indexer和Search. Indexer:负责从MySQL拉取数据源,把数据源分词,建立索引. Search:搜索模块. CoreSeek工作 ...