引言

在多进程环境下,多个进程同时读写一个文件,如果不进行同步,就可能导致不期待的结果,如后一个进程覆盖了前一个进程写的内容。Unix为此提供了一种强大的解决办法:记录锁

记录锁

记录锁本质上就是对文件加读写锁,但是它不仅可以对整个文件加锁,也可以对文件的某块区域加锁,这正是其强大之处。

其主要由两部分构成,操作类型和加锁区域

struct flock{short l_type; /* 操作类型:加读锁(F_RDLCK),加写锁(F_WRLCK),解锁(F_UNLCK) */// 加锁区域off_t l_start; /* 开始位置 */off_t l_len; /* 区域长度 , 为0时,表示从开始位置到文件末尾的所有区域都加锁 */......
}

加锁和解锁

通过调用fcntl,并设置cmd为F_SETLK,再传入flock结构,就可以加锁解锁了

#include <fcntl.h>
int fcntl(int fd, int cmd, .../* struct flock *flockptr */);

值得一提的是,如果先对某块区域加了锁,解锁时可以只部分解锁。

当对于文件的某个区域加锁时,这条加锁记录是放在vnode节点上的

释放锁

除了调用fcntl释放锁外,还有一些隐式释放的方法。

  • 调用close关闭文件时,会释放进程再这个文件上加的锁
  • 进程退出时,会调用close方法关闭文件描述符,也就会释放锁

锁继承

当fork子进程时,子进程不会继承父进程加的记录锁,根本原因在于锁记录存在于vnode上,而vnode是内核数据,fork只会复制用户地址空间的数据,而且子进程的ID和父进程也不同,所以子进程不会继承父进程的加的记录锁

建议性锁和强制性锁

当一个进程调用fcntl对文件加了记录锁后,其他进程是可以直接调用read和write函数读写该文件的,这时加的锁称为建议性锁。

如果需要在调用read和write时,检查读写区域是否加锁,就需要加强制性锁。通过设置文件的“set-group-id”位,并取消文件组执行位,调用fcntl就加的是强制性锁了

unix环境高级编程 pdf_UNIX环境高级编程——记录锁相关推荐

  1. unix环境高级编程 pdf_Unix环境编程-详解coredump

    我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下会产生一个叫做core的文件. 通常情况下,c ...

  2. Unix环境高级编程(十五)高级I/O

    1.非阻塞I/O 对低速设备的I/O操作可能会使进程永久阻塞,这类系统调用主要有如下情况: (1)如果数据并不存在,则读文件可能会使调用者永远阻塞(例如读管道.终端设备和网络设备). (2)如果数据不 ...

  3. unix网络编程 的环境配置

    <unix网络编程> 的环境配置 首先在网上下载UNP的库文件,然后就可以安装学了.我的系统环境: 2.6.32-131.0.15.el6.i686 #1 SMP Sat Nov 12 1 ...

  4. 【花雕体验】05 搭建行空板开发环境之SSH连接与Jupyter编程

    行空板支持多种编程软件,除了内置Jupyter编辑器,同时还支持IDLE,Thonny,VSCode等一切能输出py文件的编程软件,或者使用更极客的SSH命令行工具,以及还有Mind+的支持,也可以使 ...

  5. [内核编程] 内核环境及其特殊性,驱动编程基础篇

    [内核编程] 内核环境及其特殊性,驱动编程基础篇  在学习汉江独钓一书后,打算总结一下内核编程应该注意的事项,以及有关的一些基础知识.第一次接触内核编程,还真是很生疏,很多东西不能一下马上消化.这里做 ...

  6. CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念)、早期/中期/近期应用领域(偏具体应用)、经典CNN架构(偏具体算法)概述、常用工具/库/框架/产品、环境安装、常用数据集、编程技巧

    CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念).早期/中期/近期应用领域(偏具体应用).经典CNN架构(偏具体算法)概述.常用工具/库/框架/产品.环境安装.常用数据集.编程技巧 ...

  7. 好书推荐---单片机编程魔法师之高级裸编程思想

    <单片机编程魔法师之高级裸编程思想>以单片机裸环境为基础,为编程者定义了一个微操作系统(MOS)的编程环境,并面向应用中不断提高的需求对编程策略进行了深度剖析与研究,从而分离出数据驱动.并 ...

  8. PHP编程开发环境建立—windows10(家庭版,64位)vs2019(64位)+apache24+php8+mysql8+phpMyAdmin5

    PHP编程开发环境建立-windows10(家庭版,64位)visualstudio2019(vc16,64位)+apache24+php8+mysql8+phpmyadmin5) 第一次学习文档(1 ...

  9. 【Linux】Linux系统编程(入门与系统编程)(三)(深入理解操作系统、进程、环境变量、内存分布)

    本博客操作系统最多涉及30%的理论,重点在于部分进程的内容,部分文件系统的内容,部分文件管理的内容不是主讲操作系统,我们的最终目的是理解系统中最高频的知识点,然后被完全利用指导我们编程. 下面是这三篇 ...

最新文章

  1. 在拓扑图上做标准ACL和扩展ACL(期末考试)
  2. 在RHEL7.8上安装配置tomcat
  3. Python-OpenCV学习 -- 台式机外接USB摄像头的视频读取
  4. 获取本机IP地址[JavaScript / Node.js]
  5. 15. 3Sum_左右开工,遍历找出符合目标的数字
  6. ByteBuf的源码分析
  7. 数据草拟:使您的团队热爱数据的研讨会
  8. 项目案例第二篇中小型公司优化性能安全篇
  9. js与C#服务端 json数据交互
  10. 前台页面通过ajax环境和js调用web service的几种方法
  11. (转)使用Spring的注解方式实现AOP的细节
  12. shell command 输入时的快捷键
  13. 时间序列数据的特征提取
  14. SpringBoot项目防止Sql注入
  15. [SPRD] 版本修改集锦
  16. 学习金蝶ERP 之 K3 介绍
  17. android脸萌3
  18. 开源协议BSD、Apache2、GPL、LGPL、MIT
  19. 计算机网络连接在哪,本地连接在哪里找【四种方法】
  20. HTML样式表两个表格距离为零,css表格单元格间距怎么调整?

热门文章

  1. vfp程序转换为c语言程序软件,c语言程序设计及vfp程序设计试题.doc
  2. apache log4j入门
  3. html 中加号的表示方法,CSS的+(加号)选择器怎么用
  4. [2020-ECCV]PIPAL-a Large-Scale Image Quality Assessment Dataset for Perceptual Image Restoration论文简析
  5. 动态新增表字段_制作动态的数据透视表(一):定义名称法创建数据透视表
  6. gmp计算机系统课件,EU GMP附录11计算机系统◆问答
  7. testufo测试刷新率测试_上手体验微星电竞显示器PAG301CR:200Hz高刷新率只是它的小亮点...
  8. 二级MS Office公共基础知识错题本(1)
  9. 线程停止继续_线程不是你想中断就能中断
  10. 蓝牙扫描过程解析_智慧定位系统之蓝牙网关在室内定位技术的原理浅析-新导智能...