unix环境高级编程 pdf_UNIX环境高级编程——记录锁
引言
在多进程环境下,多个进程同时读写一个文件,如果不进行同步,就可能导致不期待的结果,如后一个进程覆盖了前一个进程写的内容。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环境高级编程——记录锁相关推荐
- unix环境高级编程 pdf_Unix环境编程-详解coredump
我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下会产生一个叫做core的文件. 通常情况下,c ...
- Unix环境高级编程(十五)高级I/O
1.非阻塞I/O 对低速设备的I/O操作可能会使进程永久阻塞,这类系统调用主要有如下情况: (1)如果数据并不存在,则读文件可能会使调用者永远阻塞(例如读管道.终端设备和网络设备). (2)如果数据不 ...
- unix网络编程 的环境配置
<unix网络编程> 的环境配置 首先在网上下载UNP的库文件,然后就可以安装学了.我的系统环境: 2.6.32-131.0.15.el6.i686 #1 SMP Sat Nov 12 1 ...
- 【花雕体验】05 搭建行空板开发环境之SSH连接与Jupyter编程
行空板支持多种编程软件,除了内置Jupyter编辑器,同时还支持IDLE,Thonny,VSCode等一切能输出py文件的编程软件,或者使用更极客的SSH命令行工具,以及还有Mind+的支持,也可以使 ...
- [内核编程] 内核环境及其特殊性,驱动编程基础篇
[内核编程] 内核环境及其特殊性,驱动编程基础篇 在学习汉江独钓一书后,打算总结一下内核编程应该注意的事项,以及有关的一些基础知识.第一次接触内核编程,还真是很生疏,很多东西不能一下马上消化.这里做 ...
- CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念)、早期/中期/近期应用领域(偏具体应用)、经典CNN架构(偏具体算法)概述、常用工具/库/框架/产品、环境安装、常用数据集、编程技巧
CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念).早期/中期/近期应用领域(偏具体应用).经典CNN架构(偏具体算法)概述.常用工具/库/框架/产品.环境安装.常用数据集.编程技巧 ...
- 好书推荐---单片机编程魔法师之高级裸编程思想
<单片机编程魔法师之高级裸编程思想>以单片机裸环境为基础,为编程者定义了一个微操作系统(MOS)的编程环境,并面向应用中不断提高的需求对编程策略进行了深度剖析与研究,从而分离出数据驱动.并 ...
- PHP编程开发环境建立—windows10(家庭版,64位)vs2019(64位)+apache24+php8+mysql8+phpMyAdmin5
PHP编程开发环境建立-windows10(家庭版,64位)visualstudio2019(vc16,64位)+apache24+php8+mysql8+phpmyadmin5) 第一次学习文档(1 ...
- 【Linux】Linux系统编程(入门与系统编程)(三)(深入理解操作系统、进程、环境变量、内存分布)
本博客操作系统最多涉及30%的理论,重点在于部分进程的内容,部分文件系统的内容,部分文件管理的内容不是主讲操作系统,我们的最终目的是理解系统中最高频的知识点,然后被完全利用指导我们编程. 下面是这三篇 ...
最新文章
- 在拓扑图上做标准ACL和扩展ACL(期末考试)
- 在RHEL7.8上安装配置tomcat
- Python-OpenCV学习 -- 台式机外接USB摄像头的视频读取
- 获取本机IP地址[JavaScript / Node.js]
- 15. 3Sum_左右开工,遍历找出符合目标的数字
- ByteBuf的源码分析
- 数据草拟:使您的团队热爱数据的研讨会
- 项目案例第二篇中小型公司优化性能安全篇
- js与C#服务端 json数据交互
- 前台页面通过ajax环境和js调用web service的几种方法
- (转)使用Spring的注解方式实现AOP的细节
- shell command 输入时的快捷键
- 时间序列数据的特征提取
- SpringBoot项目防止Sql注入
- [SPRD] 版本修改集锦
- 学习金蝶ERP 之 K3 介绍
- android脸萌3
- 开源协议BSD、Apache2、GPL、LGPL、MIT
- 计算机网络连接在哪,本地连接在哪里找【四种方法】
- HTML样式表两个表格距离为零,css表格单元格间距怎么调整?
热门文章
- vfp程序转换为c语言程序软件,c语言程序设计及vfp程序设计试题.doc
- apache log4j入门
- html 中加号的表示方法,CSS的+(加号)选择器怎么用
- [2020-ECCV]PIPAL-a Large-Scale Image Quality Assessment Dataset for Perceptual Image Restoration论文简析
- 动态新增表字段_制作动态的数据透视表(一):定义名称法创建数据透视表
- gmp计算机系统课件,EU GMP附录11计算机系统◆问答
- testufo测试刷新率测试_上手体验微星电竞显示器PAG301CR:200Hz高刷新率只是它的小亮点...
- 二级MS Office公共基础知识错题本(1)
- 线程停止继续_线程不是你想中断就能中断
- 蓝牙扫描过程解析_智慧定位系统之蓝牙网关在室内定位技术的原理浅析-新导智能...