[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. [PHP]使用PHPMailer发送带附件并支持HTML内容的邮件

    来源:http://www.helloweba.com/view-blog-205.html PHPMailer是一个封装好的PHP邮件发送类,支持发送HTML内容的电子邮件,以及可以添加附件发送,并 ...

  2. PLC M8000 M8001 M8002 M8003

  3. raw,cow,qcow,qcow2镜像的比较

    在linux下,虚拟机的选择方式有很多,比如vmware for linux,virtual box,还有qemu,在以前,使用qemu的人不多,主要是使用起来有些麻烦,但现在随着Openstack的 ...

  4. GIT GUI的使用

    http://blog.csdn.net/fym0512/article/details/7713006

  5. 2.springMVC+spring+Mybatis整合

    前面已经说了,springMVC+spring+Mybatis的整合思路了,现在就照着这个思路来做一下: 在开始之前先来看一下工程的目录结构: config这个目录底下放的都是配置文件: mybati ...

  6. 56992 vuser_init.c(12): Error: Socket descriptor not found.

    Loadrunner 运行场景时提示" vuser_init.c(12): Error: Socket descriptor not found.  Hint: the problem mi ...

  7. MVC Razor基础

    @ 可以编写一条C#语句@{} 可以编写一组C#语句@: 将文字内容直接输出到页面上去@() 在一句中将一段C#代码包括起来,证明这一句完整的C#代码 Razor解决路径问题: Html.Action ...

  8. oracle ORA-01427: 单行子查询返回多个行

    ORA-01427: 单行子查询返回多个行 前几天开发的同事反馈一个问题,说前台系统报出了ORA错误,希望我们能看看是什么原因.java.sql.SQLException: ORA-01427: si ...

  9. secure boot(安全启动)下为内核模块签名

    上一篇随笔中提到了如何在secure boot下安装Nvidia显卡驱动 >>上一篇随笔 如果不需要安装Nvidia显卡驱动,而且要生成密钥,可以参考>> 这篇文章 这里假设生 ...

  10. 【UVA11082】Matrix Decompressing(有上下界的网络流)

    题意:给出一个矩阵前i列所有元素的和,和前j行所有元素的和,求这个矩阵解压以后的原型.(答案不唯一) n,m<=20,1<=a[i,j]<=20 思路:这道题把边上的流量作为原先矩阵 ...