[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:(文件)记录锁的更多相关文章

  1. [apue] 使用文件记录锁无法实现父子进程交互执行同步

    父子进程间交互执行是指用一种同步原语,实现父进程和子进程在某一时刻只有一个进程执行,之后由另外一个进程执行,用一段代码举例如下: SYNC_INIT(); , counter=; pid_t pid ...

  2. linux 文件记录锁详解

    一: linux记录锁更恰当的称呼应该是范围锁,它是对文件某个范围的锁定. 关于记录锁的功能就是fcntl提供的第五个功能,具体使用如下: int fcntl(int fd, int cmd, str ...

  3. [21]APUE:线程同步之记录锁(文件)

    [a] 概念 建议锁:在遵循相同记录锁规则的进程/线程间生效,通常用于保证某个程序自身多个进程/线程间的数据一致性 强制锁:意在保证所有进程间的数据一致性,但不一定有效:如不能应对先 unlink 后 ...

  4. APUE 文件IO

    文件 IO 记录书中的重要知识和思考实践部分 Unix 每个文件都对应一个文件描述符(file descriptor),为一个非负整数,一个文件可以有多个fd, 后面所有与文件(设备,套接字等)有关操 ...

  5. 非阻塞io与记录锁

    非阻塞io 1.对比 阻塞io的例子:scanf从终端获取输入时,如果不输入程序就会一直停在那; 对一个已经有写锁的文件请求读时, 会一直空等直到前面的进程释放锁... 非阻塞的例子:读取文件内容, ...

  6. 高级I/O之记录锁

    若两个人同时编辑一个文件,其后果将如何呢?在很多UNIX系统中,该文件的最后状态取决于写该文件的最后一个进程.但是对于有些应用程序(例如数据库),进程有时需要确保它正在单独写一个文件.为了向进程提供这 ...

  7. Linux进程同步之记录锁(fcntl)

    记录锁相当于线程同步中读写锁的一种扩展类型,可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步,通过fcntl函数来执行上锁操作.尽管读写锁也可以通过在共享内存区来进行进程的同步,但是fcntl记 ...

  8. [APUE] 文件 I/O

    文件操作相关 API:open, read, write, lseek, close. 多进程共享文件的相关 API:dup, dup2, fcntl, sync, fsync, ioctl. 文件操 ...

  9. fcntl记录锁实例

    fcntl 函数是一个相当常用的对文件进行加锁操作的函数. 文件锁包括强制锁.建议锁.记录锁, 不过一般系统和内核都是用的强制锁. 以下为记录锁的例子:------------------------ ...

随机推荐

  1. git不是内部命令和可执行程序解决方法

    1.从Git官网下载windows版本的git:http://git-scm.com/downloads 2.一般使用默认设置即可:一路next,git安装完毕! 3.但是如果这时你打开windows ...

  2. python开发 Day1 python基础

    编程语言主要从以下几个角度为进行分类,编译型和解释型.静态语言和动态语言.强类型定义语言和弱类型定义语言,每个分类代表什么意思呢,我们一起来看一下. 编译和解释的区别是什么? 编译器是把源程序的每一条 ...

  3. SQL语句优化实践

    减少查询的影响结果集,避免出现全表扫描. 影响结果集是SQL优化的核心.影响结果集不是查询返回的记录数,而是查询所扫描的结果数.通过Explain或Desc分析SQL,rows列的值即为影响结果集(还 ...

  4. calc常用

    Mod:求模(整数相除求余数), And:按位与 Or:按位或 Xor:按位异或 Lsh:按位左移 Not:按位取反 Int:取整数部分

  5. MySQL常见错误及其解决办法

    1.连接类 (1).问题:MySQL server has gone away  解决办法:出现该报错常见的原因是服务器超时了并且关闭了连接.缺省地,如果没有事情发生,服务器在 8个小时后关闭连接.如 ...

  6. UML大战需求分析阅读笔记3

    UML各种图的中文译名,因为翻译的原因可能会有所不一样,如:Sequence Diagram和Timing Diagram有时候都会被译成"时序图",这是最让人困扰的地方!Sequ ...

  7. C# POST请求

    public string PostWebRequest(string postUrl, string paramData, Encoding dataEncode) { string ret = s ...

  8. Java OOP中的字符串篇

    字符串的三大特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String.St ...

  9. @ModelAttribute 注解及 POJO入参过程

    一.modelattribute注解 @ModelAttribute注解的方法有两种,一种无返回值,一种有返回值,方法的可以用@RequestParam注解来获取请求的参数,如果不获取参数,可以不用此 ...

  10. StringUtils方法全集

    org.apache.commons.lang.StringUtils中方法的操作对象是java.lang.String类型的对象,是JDK提供的String类型操作方法的补充,并且是null安全的( ...