使用系统调用fcntl()来对文件加锁

在文已经共享的情况下如何操作,也就是当多个进程同时操作同一个文件时,我们怎么保证文件数据的正确性。linux通常采用的方法是文件上锁,来避免共享资源的产生竞争状态。

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

在linux中对文件进行锁操作,可以使用lockf()和fcntl()这两个函数,前者对文件施加建议性锁,后者为两种锁都行。另外fcntl还可以对文件的某一记录上锁。

fcntl使用格式为:

int fcntl(int fd,int cmd,struct flock *lock);

fd为文件描述符,cmd为一些命令参数,flcok结构体用来设置记录锁的具体状态。

fcntl() 对已打开的文件描述符进行操作,并根据命令参数的不同能够执行不同的任务。关于文件锁的几个命令选项如下:

       F_GETLK 根据lock参数值,决定是否上文件锁

    F_SETLK 设置lock参数值的文件锁

    F_SETLKW 这是 F_GETLK的阻塞版本,在无法获取锁时,会进入睡眠状态。

      flock结构体的定义如下:

    struct flock {

    short l_type;

    off_t l_start;

    short l_whence;

    off_t l_len;

    pid_t l_pid;

    }

    l_type有三个选项:

    F_RDLCK : 共享锁,只读用

    F_WRLCK : 独占锁(写操作锁)

                   F_UNLCK : 解除锁定

l_start 为相对位移量

l_whence 必须是以下几个值之一( 在 unistd.h 中定义):

                  SEEK_SET : 文件开始位置

                  SEEK_CUR: 文件当前位置

                  SEEK_END: 文件末尾位置

l_len 加锁的长度

l_pid当前文件操作的进程id号

下面是简单的例子

运行结果:

读是可以共享的。

写的例子:

运行结果:

同时写的话,发生竞争,后者不能对文件做写操作,只有当当前的锁解开,后续的才可写文件

时间: 2024-10-30 14:25:10

使用系统调用fcntl()来对文件加锁的相关文章

Python中给文件加锁

首先要引入库import fcntl打开一个文件f = open('./test')对该文件加密:fcntl.flock(f, fcntl.LOCK_EX)这样就对文件test加锁了,如果有其他进程要对test进行加锁,则不能成功,会被阻塞,但不会退出程序.解锁:fcntl.flock(f,fcntl.LOCK_UN)解锁后,其他进程就可以对该文件进行加锁了.另外还有一种共享锁:acquire a shared lockfcntl.flock(f,fcntl.LOCK_SH) 还有一篇文章htt

SVN ---文件加锁,执行clean up命令

一.SVN 中 clean up 的功能 当Subversion改变你的工作拷贝(或是.svn中的任何信息),它会尽可能的小心,在修改任何事情之前,它把意图写到日志文件中去,然后执行 log文件中的命令,并且执行过程中在工作拷贝的相关部分保存一个锁,防止Subversion客户端在变更过程中访问工作拷贝.如果 Subversion的操作中断了(举个例子:进程被杀死了,机器死掉了),日志文件会保存在硬盘上,通过重新执行日志文件,Subversion可以完成上一次开始的操作,你的工作拷贝可以回到一致

php文件加锁 lock_sh ,lock_ex

文件锁有两种:共享锁和排他锁,也就是读锁(LOCK_SH)和写锁(LOCK_EX) 文件的锁一般这么使用: $fp = fopen("filename", "a"); flock($fp, LOCK_SH) or die("lock error") $str = fread($fp, 1024); flock($fp, LOCK_UN); fclose($fp); 注意fwrite之后,文件立即就被更新了,而不是等fwrite然后fclose之后

SVN与TortoiseSVN实战:文件加锁详解

硬广:<SVN与TortoiseSVN实战>系列已经写了八篇,本篇是完结篇,整个系列结合TortoiseSVN对SVN中容易被忽视的部分进行了详解,以技巧性为主. 本篇详解使用TortoiseSVN对文件进行加锁和解锁的技巧,其中涉及到了之前介绍的SVN属性知识,关于属性可以翻看<SVN与TortoiseSVN实战:属性的奇技淫巧(一)>.<SVN与TortoiseSVN实战:属性的奇技淫巧(二)>. 加锁与解锁的操作对于项目中的二进制文件,如图片.声音.动态库等不可合

PHP flock实现文件加锁

flock在官方文档里的解释是:flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是Windows).如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE.锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用). 简单来说,就是对一个文件进行锁定操作,使得多进程访问该文件时受到限制,从而防止冲突.举个例子: <?php $file = fopen("test.txt&qu

SVN文件加锁

原文:SVN与TortoiseSVN实战:文件加锁详解 加锁与解锁的操作对于项目中的二进制文件,如图片.声音.动态库等不可合并文件是非常有用的,可以让这些文件防止产生恼人的冲突,但TortoiseSVN中的Get lock的其实并不能满足需要,并不能在编辑前获得对文件的独占访问,这也是本文要结合属性来详解文件加锁的原因. 本篇内容概要: 1.版本控制系统的加锁策略:乐观加锁.严格加锁: 2.使用TortoiseSVN获取锁和释放锁: 3.使用属性,将文件设置为只读: 4.关于锁的建议: 1.版本

fcntl.h头文件

close(关闭文件) 相关函数 open,fcntl,shutdown,unlink,fclose 表头文件 #include<unistd.h> 定义函数 int close(int fd); 函数说明 当使用完文件后若已不再需要则可使用close()关闭该文件,二close()会让数据写回磁盘,并释放该文件所占用的资源.参数fd为先前由open()或creat()所返回的文件描述词. 返回值 若文件顺利关闭则返回0,发生错误时返回-1. 错误代码 EBADF 参数fd 非有效的文件描述词

SVN中如何为文件夹中的所有文件加锁

经过一段时间的试用,发现不加锁的共享式开发还是不太方便.还是全部设置为独占式加锁,如有共享式修改需求再设置为不加锁比较好. 经过一番摸索,总结出如下的加锁方式是可行的: 注:第一步是必须的,必须完成第一步才能做后续操作,否则项目无法生成! 1.如果某些项目包含bin.obj等生成的文件夹,如下图右键选中相应菜单并提交(右键SVN Commit  ) 2.在所在的项目文件夹上右键,选菜单如下图: 3.在所在文件夹上右键提交修改. ―――――――――――――――――如何修改回原来的共享式开发――――

PHP使用flock实现文件加锁来防止多进程同时写入文件

lock在官方文档里的解释是:flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是Windows).如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE.锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用). 简单来说,就是对一个文件进行锁定操作,使得多进程访问该文件时受到限制,从而防止冲突.举个例子: <?php    $file = fopen("test.txt&