1、什么是文件和记录锁定?

文件锁定的是整个文件,而记录锁定只锁定文件的一部分,文件和记录锁分为咨询式锁定和强制锁定

1)咨询式锁定

某个进程对某个文件进行了咨询式锁定,其他想访问该文件的进程将会被操作系统告知文件已经上锁,但并不阻止这些进程对锁定文件的操作,只要有对锁定文件的存取权,这些进程便可忽略咨询式锁定而去写文件。比如Symtem V和BSD两种锁

2)强制锁定

操作系统会对每一个读写文件的请求进行核查,只有在确认该请求下不会干扰上了锁的文件,才允许对应的操作。

2、System V的咨询锁定

锁函数为lockf()

#include <unistd.h>
int lockf(int fd, int function, long size);
/*
参数fd 是在文件打开操作中获得的文件描述符;
参数function 可以取如下的参数值:
F_ULOCK 为一个先前锁定的区域解锁
F_LOCK 锁定一个区域
F_TLOCK 测试并锁定一个区域
F_TEST 测试一个区域是否已经上锁。
参数size 指明了从文件当前位置开始的一段连续锁定区域的长度,当size 为0 时,锁
定记录将由当前位置一直扩展到文件尾。
*/

  如果lockf的参数function为F_LOCK指定文件的对应区域已经被其他进程锁定,那么lockf的调用进程将被阻塞直到该区域解锁,这种情况称为阻塞。若参数设定为F_TLOCK,那么当被测试区域上了锁时,lockf将会立即返回-1,这是一个非阻塞调用

下面是上锁和解锁的函数实现

#include <unistd.h>
my_lock(int fd)
{
/* 将文件指针移回文件头 */
lseek(fd,0L,0);
/* 锁定整个文件 */
if (lockf(fd,F_LOCK,0L)==-1)
{
perror("can't F_LOCK");
exit(1);
}
}
my_unlock(int fd)
{
lseek(fd,0L,0);
if(lockf(fd,F_ULOCK,0L)==-1)
{
perror("can't F_UNLOCK");
exit(1);
}
}

  

3、BSD的咨询式锁定

#include <sys/file.h>
int flock(int fd, int operation);
/*
调用flock 有两个参数:
参数fd 是一个已打开文件的文件描述符;
参数operation 可设定为下述各值:
LOCK_SH 共享锁
LOCK_EX 互斥锁
LOCK_UN 解锁
LOCK_NB 当文件已被锁定时不阻塞
*/

  

4、两种锁的比较

1)System V是记录锁定,可以指定锁定的范围,BSD是文件锁定

2)System V是每个进程独有,可以用于父子进程间的共享锁定,而BSD的锁定方式是可以继承的,父子进程间使用的是同一锁定的,所以不能用于父子进程间的文件共享锁。

5、其他锁定技术

创建和使用一个辅助文件以表示进程对共享文件的锁定操作是其他锁技术的基本点,如果辅助文件存在,则资源被其他进程锁定,否则,进程就创建辅助文件以对资源上锁。

Linux网络编程学习(八) ----- 文件和记录锁定(第四章)的更多相关文章

  1. Linux网络编程学习(三) ----- 进程控制实例(第三章)

    本节主要介绍一个进程控制的实例,功能就是在前台或者后台接收命令并执行命令,还能处理由若干个命令组成的命令行,该程序命名为samllsh. 基本逻辑就是 while(EOF not typed) { 从 ...

  2. Linux网络编程学习路线

    转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程   1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...

  3. Linux网络编程学习计划

    由于网络编程是很重要的一块,自己这一块也比较欠缺,只知道一些皮毛,从今天开始系统学习<Linux网络编程>一书,全书分为十四个章节: 第一章   概论   P1-16 第二章   UNIX ...

  4. Linux网络编程学习(十二) ----- 结语

    该书提前看完了,重点看了第四章和第六章,第七章以后只是大致浏览了一下,如果以后工作中涉及这一块再仔细研究一下,大概花了二十天的样子,主要了解了进程间的通信方式.socket编程以及五种I/O模式,看的 ...

  5. Linux网络编程学习(七) ----- 有名管道(第四章)

    1.什么是有名管道?为什么有了管道还需要有名管道? 有名管道是解决管道不能提供非父子进程间通信的缺陷.管道在Linux系统内部是以文件节点(inode)的形式存在,但由于其对外的不可见性(“无名”性) ...

  6. linux网络编程学习笔记之四 -----多-threaded服务器

    对于使用过程中并发.通过实现更轻量级线程. 每个线程都是一个独立的逻辑流. 主题是CPU在执行调度的最小独立单位,这个过程是资源分配单元.当然,这是在微内核操作系统说.总之,这是唯一的一个操作系统内核 ...

  7. Linux网络编程学习(十) ----- Socket(第六章)

    前言:由于第五章主要介绍了TCP和UDP协议以及两者的包头的字段以及相应的功能,这里就不介绍了,对着字段看功能就好了,后续开始学习第六章 1.Socket Socket实质上就是提供了通信的端点,每个 ...

  8. linux网络编程常用头文件

    sys/types.h:数据类型定义 sys/socket.h:提供socket函数及数据结构 netinet/in.h:定义数据结构sockaddr_in arpa/inet.h:提供IP地址转换函 ...

  9. linux网络编程学习笔记之三 -----多进程并发服务端

    首先是fork()函数.移步APUE 8.3.  比較清晰的解释能够參考http://blog.csdn.net/lingdxuyan/article/details/4993883和http://w ...

随机推荐

  1. Spring BOOT的学习笔记

    1,静态文件夹src/main/resources/static下的,图片必须放在images文件夹下才能访问,直接放在static下不能访问 2,配置热部署,否则修改下Html,图片都得重启 htt ...

  2. java8_api_math

    java.math包    BigDecimal    BigInteger    MathContext    RoundingMode这是枚举        BigDecimal        不 ...

  3. Vue01

    1.vue.js库的下载 vue.js是目前前端web开发最流行的工具库,由尤雨溪在2014年2月发布的. 另外几个常见的工具库:react.js /angular.js 官方网站: 中文:https ...

  4. 【Python】SciKit-Learn包安装问题

    pip install scikit-learn 如果失败的话,可以考虑直接升级pip 我原先的pip版本是10.0.1 安装失败 升级pip到18.1后,在安装就成功了

  5. httpd2.4.6配置文件解释说明

    本文httpd版本为:2.4.6 ServerRoot 先来看一下httpd.conf配置文件中的ServerRoot默认定义: # cat /etc/httpd/conf/httpd.conf |e ...

  6. 小程序中添加客服按钮contact-button

    小程序的客服系统,是微信做的非常成功的一个功能,开发者可以很方便的通过一行代码,就可实现客服功能. 1. 普通客服按钮添加 <button open-type='contact' session ...

  7. 报错:Heartbeating to master:7182 failed.

    报错背景: cloudera-scm-agent 可以启动并且存活,但是jps没有进程. 报错现象: 查看报错日志:/opt/cm-5.15.1/log/cloudera-scm-agent/clou ...

  8. Ubuntu 16.04 安装Go 1.9.2

    系统环境 Ubuntu: 16.04 Go: 1.9.2 安装步骤 $ curl -O https://storage.googleapis.com/golang/go1.9.linux-amd64. ...

  9. jumpservice配置:快速入门

    快速入门 说明 到 Jumpserver 会话管理-终端管理 查看 Coco Guacamole 等应用是否在线 一.系统设置 1.1 基本设置 # 修改 url 的"localhost&q ...

  10. php变量函数

    这个东西相当于C语言中的函数指针,C#里的委托   function come() {                   //定义com函数 echo "来了<p>" ...