Linux系统文件I/O编程(二)

您所在的位置:网站首页 文件系统编程 Linux系统文件I/O编程(二)

Linux系统文件I/O编程(二)

2024-07-09 12:31:08| 来源: 网络整理| 查看: 265

文件锁

    上一节:http://blog.csdn.net/mybelief321/article/details/8989755讲述的5个基本函数函数open()、read()、write()、lseek()和close()实现的文件的打开、读/写等操作,本节将讨论在文件已经共享的情况下如何操作,也就是当多个用户共同使用、操作一个文件的情况。这时,Linux通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。

   文件锁包括建议性锁和强制性锁。建议性锁要求每个上锁文件的进程检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁。强制性锁是由内核执行的锁,当一个文件被上锁执行写入操作时,内核将阻止其他任何文件对其进行读写操作。采用强制性锁对性能影响很大,每次读写都必须检查是否有锁存在。

   在Linux中,实行文件上锁的函数有lockf()和fcntl(),其中lockf()用于对文件施加建议性锁,而fcntl()不仅可以施加建议性锁,还可以施加强制性锁。同时,fcntl()还能对文件的某一记录上锁,也就是记录锁。

   记录锁又可分为读取锁和写入锁,其中读取锁又称为共享锁,它能够使多个进程都能在文件的同一部分建立读取锁。而写入锁又称为排斥锁,在任何时刻只能有一个进程在某个部分建立写入锁。当然,在文件的同一部分不能同时建立读取锁和写入锁。

   fcntl()函数具有很丰富的功能,它可以对已打开的文件描述符进行各种操作,不仅包括管理文件锁,还包括获得设置文件描述符和文件描述符标志、文件描述符的复制等很多功能!这一次我先学习一下fcntl()函数建立文件锁的方法,关于它的另外的用法...先学会了这个再说吧!

fcntl()函数格式

  

   表1中的lock是一个flock结构体,结构如下:

  

   上图中的 off_t 就是数据类型 long int ;pid_t 就是数据类型  int,不懂这里有解释:点此解释

   那么这个结构体lock中每个变量的取值含义如下表2

 

基础实验

   本实验主要是为了练习一下fcntl()函数的文件记录锁的功能。下面首先给出了使用fcntl(0函数的文件记录锁功能的代码实现。

   在该代码中,首先给flock结构体的对应位赋予相应的值。接着调用两次fcntl()函数,使用F_GETLK命令判断是否可以进行flock结构体所描述的锁操作:若可以进行,则flock结构的l_type会被设置为F_UNLCK,其他域不变;若不可进行,则l_pid被设置为拥有文件锁的进程号,其他域不变。

   用F_SETLK和F_SETLKW命令设置flock结构所描述的锁操作,后者是前者的阻塞版。    当第一次调用fcntl()时,使用F_FETLK命令获得当前文件被上锁的情况,由此可以判断能不能进行上锁操作;当第二次调用fcntl()时,使用F_SETLKW命令对指定文件进行上锁/解锁操作。因为F_SETLKW命令是阻塞式操作,所以,当不能把上锁/解锁操作进行下去时,运行会被阻塞,直到能够进行操作为止。

  本次实验代码均上传到了网站,请自行下载:点此下载

   文件记录锁的功能代码具体如下:

/*lock_set.c*/ int lock_set(int fd,int type) {  struct flock old_lock,lock;  /*定义flock结构体*/  lock.l_whence=SEEK_SET;  /*加锁整个文件*/  lock.l_start=0;  lock.l_len=0;    lock.l_type=type;     lock.l_pid=-1;      /*判断文件是否可以上锁 */  fcntl(fd,F_GETLK,&lock);  if(lock.l_type!=F_UNLCK)  {   /*判断文件不能上锁的原因 */   if(lock.l_type==F_RDLCK) /*该文件已经有读取锁 */   {     printf("Read lock already set by %d\n",lock.l_pid);   }    else if(lock.l_type==F_WRLCK) /*该文件已经有写入锁 */   {     printf("Write lock already set by %d\n",lock.l_pid);        }  }    /*l_type 可能在执行完上述判断后被修改了*/  lock.l_type=type;  /*根据不同的type值进行阻塞式上锁或解锁*/  if((fcntl(fd,F_SETLKW,&lock))



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭