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. linux下突破10万高并发的nginx性能优化经验

    一.这里的优化主要是指对nginx的配置优化,一般来说nginx配置文件中对优化比较有作用的主要有以下几项:1)nginx进程数,建议按照cpu数目来指定,一般跟cpu核数相同或为它的倍数.worke ...

  2. 常用oracle中系统表查询语句

    sqlplus / as sysdbaSQL>select status from v$instance;1.查看最大连接数show parameter processes;2.查询oracle ...

  3. 详解java定时任务---Timer篇

    一.简介      在java的jdk中提供了Timer.TimerTask两个类来做定时任务. Timer是一种定时器工具,用来在一个后台线程计划执行指定任务,而TimerTask一个抽象类,它的子 ...

  4. 2、冒泡排序法(C语言)

    一.冒泡算法实现分析 1.假设有5个元素分别为8,6,15,9,3对其进行冒泡排序,我们需要关注的有三点如下: (1)元素个数 n: (2)需要比较的趟数 i: (3)每趟比较的次数 j: 2.它们之 ...

  5. JavaWeb数据库长时间不访问断开链接解决思路

    这几天开发的线上商超系统长时间不操作,会频繁的出现第一次登陆或者跟数据库操作有关的方法都会报500错误,很是鸡肋啊这个问题. 经过网上不断的探索,在知识的海洋里畅游了几分钟后我自己总结出一套方法,我用 ...

  6. linux 中 && 及|| 判断原理

    [root@linuxprobe ~]# [ $USER = root ] && echo "root" || echo "user"root[ ...

  7. VSS2005源代码管理启用http方式

    一直在使用vss管理源代码,在服务器上使用文件共享当方式.最近安全形式升级,禁止使用文件共享,因此要升级到http方式. 按照网上的教程,一路前行. 1.登录服务器桌面,打开vss administr ...

  8. json,pickle,shelve模块,xml处理模块

    常用模块学习—序列化模块详解 什么叫序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 为什么要序列化? 你打游戏过程 ...

  9. 刘志梅 2017710101152《面向对象程序设计(java)》 第十周学习总结

    实验十  泛型程序设计技术 实验时间 2018-11-1 1.实验目的与要求 (1)泛型程序设计:意味着编写的代码可以被很多不同类型的对象所重用.(ArrayList类可以聚集任何类型的对象) 如果在 ...

  10. DB2调优摘要

    感谢原博主 http://yishueitian326.blog.163.com/blog/static/2858637520106695733719/ 性 能是关系到随需应变型应用程序成功与否的关键 ...