添加URL
分享

文件锁(File Lock)是一种在特定的时间内只允许一个进程进行访问文件的机制,通过使用文件锁,可以使得多进程访问文件更加安全。
在这片文章中,我们会探索两种不同的文件锁,并且通过实际案例去了解他们的机制和不同之处。

我们会举以下两个例子来解释为什么文件锁(file lock)是必须的

  1. 进程A打开并且读一个文件,这个文件关于账户信息
  2. 进程B此时也打开并且读这个相同的文件。
  3. 现在,进程A改变了一条记录,并且把改变写入了这个相同的文件内
  4. 进程B却无法知晓这个文件已经被改变了,这个时候进程B也做了相同记录改变的事情,把它的改变也写入了这个文件内
  5. 现在,这个文件只包含了进程B所做的改变

为了避免这类问题的发生,我们使用文件锁(file lock)来使进程串列化。

转载文章,请注明出处: http://blog.csdn.net/elfprincexu

接下来我们介绍两种linux的文件锁(advisory尝试性文件锁和mandatory强制性文件锁)

1. Advisory Locking
尝试性文件锁需要各个进程的无私合作,试想A进程获得一个 写 的文件锁,它开始往文件里写操作。 同时B进程,却没有去尝试获取写操作,它也同样可以进行写操作。但是很显然,B进程违反了游戏规则。我们称之为不合作进程。 尝试性文件锁,需要各个进程遵守统一规则,在文件访问时,都要礼貌的去尝试获得文件锁,然后进一步操作。

2.Mandatory Locking
强制性文件锁不需要进程的合作,强制性文件锁是通过内核强制检查文件的打开,读写操作是否符合文件锁的使用规则。
为了是强制性文件锁工作,我们必须要在文件系统上激活它,必要的操作包括

  1. 挂载mount文件系统,通过 “-o mand”参数选项
  1. 对于文件锁施加的文件,打开 set-group-id 位,并且关闭 group-execute 位。我们必须选择这种顺序,因为你一旦关闭 group-execute 位,set-group-id 就没有意义了

Linux 系统下文件锁的实际案例

为了了解linux系统下文件锁的原理,我们创建 file_lock.c 文件

#include <stdio.h>
#include <fcntl.h>
int main(int argc, char **argv) {
  if (argc > 1) {
    int fd = open(argv[1], O_WRONLY);
    if(fd == -1) {
      printf("Unable to open the file\n");
      exit(1);
    static struct flock lock;
    lock.l_type = F_WRLCK;
    lock.l_start = 0;
    lock.l_whence = SEEK_SET;
    lock.l_len = 0;
    lock.l_pid = getpid();
    int ret = fcntl(fd, F_SETLKW, &lock);
    printf("Return value of fcntl:%d\n",ret);
    if(ret==0) {
      while (1) {
        scanf("%c", NULL);
然后编译文件gcc
# cc -o file_lock file_lock.c

重新挂载文件系统,当然,必须以root身份才可以挂载,
# mount -oremount,mand /

新建两个新的文件,一个 “advisory.txt”, 另一个为 “mandatory.txt”文件,同时对“mandatory.txt” 文件开启 set-group-id 位,关闭 group-execute 位。
# touch advisory.txt
# touch mandatory.txt
# chmod g+s,g-x mandatory.txt


转载文章,请注明出处: http://blog.csdn.net/elfprincexu

1. 测试 advisory.txt 文件

现在运行刚才编译 file_lock 可执行文件,

# ./file_lock advisory.txt
这个程序会等待用户的输入,我们另开一个terminal, 并且输入以下命令:
# ls >>advisory.txt
在上面的例子中, ls 命令会把当前的名录文件信息全部写入到 advisory.txt文件中,尽管我们的file_lock程序中尝试获得write 写文件锁,但 ls 依然可以写入。

2. 测试 mandatory.txt 文件

现在运行刚才编译 file_lock 可执行文件,

# ./file_lock mandatory.txt
这个程序会等待用户的输入,我们另开一个terminal, 并且输入以下命令:
# ls >>mandatory.txt
在上面的例子中, ls 命令会把当前的名录文件信息全部写入到 advisory.txt文件中,和上面例子不同的在于,ls 命令会等待我们的file_lock 程序退出才写入文件中,尽管ls 进程仍然是个不合作进程,但是强制性文件锁迫使它遵守规则。 Linux中软件、硬件资源都是文件(一切皆文件),文件在多用户环境中是可共享的。文件锁是用于解决资源的共享使用的一种机制:当多个用户需要共享一个文件时,Linux通常采用的方法是给文件上锁,来避免共享... 来自: 好儿郎~志在四方 新加入的Advisory Locks似乎是个不错的特性 http://www.postgresql.org/docs/8.2/interactive/explicit-locking.html#ADV... 来自: 朝着梦想 渐行前进 pg_advisory_lock和pg_advisory_unlock是配对使用的,但是如果之间的部分出现异常时,可能会导致不能正确的调用pg_advisory_unlock.例如:create or... 来自: kmblack1的专栏 记录锁(record locking)的功能是:当第一个进程正在读或修改文件的某个部分时,使用记录锁可以阻止其他进程修改同一文件区。“记录”这个词是一种误用,因为UNIX系统内核根本没有使用文件记录这... 来自: 一个嵌入式小白 通过之前的open()/close()/read()/write()/lseek()函数已经可以实现文件的打开、关闭、读写等基本操作,但是这些基本操作是不够的。对于文件的操作而言,“锁定”操作是对文件... 来自: 膝盖中了一箭的博客 flock 实现细节    能够实现进程的互斥,主要是依靠了内核里统一的资源入口控制在flock 的 man page 中有关于 flock 细节的一些描述。其中说明了flock 是与打开文件的文件表... 来自: 改变生活,从思想开始 在生产者通过channel的basicPublish方法发布消息时,通常有几个参数需要设置,为此我们有必要了解清楚这些参数代表的具体含义及其作用,查看Channel接口,会发现存在3个重载的basic... 来自: weixin_41910059的博客 文章出自个人博客https://knightyun.github.io/2019/01/27/linux-apt-lock,转载请申明Linux系统中有时执行 apt install 时,可能会显示以... 来自: knight-yun的博客  级别: 初级黄 晓晨 (huangxc@cn.ibm.com), 软件工程师, IBM冯 锐 (fengrui@cn.ibm.com), 软件工程师, IBM2008 年 7 月 03 日本文的目的... 来自: tenfyguo的技术专栏 标签PostgreSQL , advisory lock , 锁背景某些业务会利用数据库来作为一种可靠的锁,例如任务调度系统,或者其他需要可靠的锁机制的系统。通常他们可能会使用数据库的一条记录来实现锁... 来自: weixin_33895657的博客 linux的文件锁分为两种:一种是advasory lock,只能保证进程内对同一个文件锁的互斥有效,但是多个进程可以同时对一个文件加互斥的锁,所以这种锁是加在file 结构上;一种是mandator... 来自: dodobear的小窝窝 http://www.thegeekstuff.com/2012/04/linux-file-locking-types/File locking is a mechanism which allow... 来自: I have a adream linux系列软件使用技巧(1)本站 null〖返回〗〖转发〗系列软件使用技巧(1) Q:如何在文本状态上网A:文本状态下当然可以使用Internet. 浏览网页:可以使用lynx ,或者links.... 来自: hem的专栏 文件锁(FileLock),使用文件锁锁住文件后,其他进程不能操作读或写文件,除非当前进程release或unlock文件锁。前两天看码云上的oim项目源码,该项目即使用了文件锁来防止同一账户重复登录... 来自: wjw的博客 虚拟控制台是 Linux 上非常重要的功能,它们给系统用户提供了 shell 提示符,以保证用户在登录和远程登录一个未安装图形界面的系统时仍能使用。一个用户可以同时操作多个虚拟控制台会话,只需在虚拟控... 来自: weixin_33858336的博客 Install.lock这个文件通常成为安装锁定保护文件,其目的是,防止在网站过程中,误重启安装向导重新安装覆盖网站数据,是一个保护作用。所有开源程序的官方安装教程中,都建议安装完毕后删除instal... 来自: ccfxue的博客 文件锁是一种文件读写机制,在任何特定的时间只允许一个进程访问一个文件。利用这种机制能够使读写单个文件的过程变得更安全。在这篇文章中,我们将探讨Linux中不同类型的文件锁,并通过示例程序来理解它们之间... 来自: Michael Xiao的程序人生 之前对于文件的操作通常在一个进程中完成,最近需要在两个进程中对同一个文件进行操作。故想到了文件锁。linux下可以使用flock()函数对文件进行加锁解锁等操作。简单介绍下flock()函数:1. 函... 来自: 我的专栏 如果多个进程,或者多个独立程序要写同一个文件,那么就存在大家同时写文件的可能,这就不妙了,数据可能会出问题。最近在网上找到一个开源的python实现,有效简洁,列出来分析下代码看看: 文件名:lock... 来自: jamexfx的博客 在之前的一个项目中用到了文件锁,从网上粗略的查了下资料就匆匆忙忙的用上了,虽然当时也有一些疑惑,但是由于项目进度比较紧,也没有多想。现在,终于有点时间可以稍微静下心来看看这个文件锁到底是怎么一回事了。... 来自: icenic的专栏 在Linux C/C++编程中,有时我们需要某个文件同时只能被一个进程打开,那么此时我们就需要多此文件进行加锁,系统中提供了两个函数来对文件加锁 flock()和fcntl(),本文主要讲解flock... 来自: Cynric 的博客 Unlocking a FileUnlock a file to edit its contents.In the project navigator, select the file.Choose ... 来自: Arduino,Raspberry李月喜 linux之安装软件出现Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)解决总结 02-09 1、问题     安装netmask出现的问题,如下图        2、解决办法sudo rm -rf /var/lib/dpkg/locksudo rm -rf /var/cache/apt/ar... 来自: chenyu 点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...... 来自: 爱开发 一、准备工作u盘,电脑一台,win10原版镜像(msdn官网)二、下载wepe工具箱极力推荐微pe(微pe官方下载)下载64位的win10 pe,使用工具箱制作启动U盘打开软件,选择安装到U盘(按照操... 来自: weixin_41964258的博客 由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,... 来自: 帅地 大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频... 来自: 帅地 很早就很想写这个,今天终于写完了。游戏截图:编译环境: VS2017游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言... 来自: 张宜强的博客 ArrayList支持所有的可选操作(因为一个UnsupportedOperationException异常都没有捕获到),所以要想拥有完备的功能,还是得使用ArrayList啊。Arrays$Arr... 来自: anlian523的博客 我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。表砍我。。。当时买mac的... 来自: qq_45036710的博客 小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm... 来自: qq_43764365的博客 概述会话技术:会话:一次会话中包含多次请求和响应一次会话:浏览器第一次给服务器发送资源请求,会话建立,直到有一方断开为止功能:在一次会话的范围内的多次请求间,共享数据方式:客户端会话技术:Cookie... 来自: miles-zh Nginx 软件层面加强Nginx性能优化的面试问答和解决方案 去年我去爱卡汽车面试PHP,一轮和二轮面的都不错,在三轮面到Nginx的时候很多问题当时不知道怎么回答,确实没有深入学习过,花了一段时间... 「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。扫描上方二维码进入 CSDN App 可以收听御姐萌妹 Sty... 导语:腾讯计费是孵化于支撑腾讯内部业务千亿级营收的互联网计费平台,在如此庞大的业务体量下,腾讯计费要支撑业务的快速增长,同时还要保证每笔交易不错账。采用最终一致性或离线补...... CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是... 作者 |曾建责编 | 郭芮出品 | CSDN(ID:CSDNnews)在项目和业务的开发中,我们难免要经常使用线程来进行业务处理,使用线程可以保证我们的业务在相互处理之间可以保证原子性...... 2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人... 很遗憾,这个鼠年春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 man: Manual 意思是手册,可以用这个命令查询其他命令的用法。 pwd:Print working directory 显示当前目录 su:Swith user ... 文章目录1. 前言2. 数据下载3. 数据处理4. 数据可视化 1. 前言 今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑...  有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸。给你一台称重精准的天平,怎么找出比较重的那瓶药丸?天平只能用一次。 有时候,严格的限制条件有可能反倒是解题... 相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有... 其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...... Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语... 在第2章节中,我们介绍了如何通过Spring Boot来实现HTTP接口,以及围绕HTTP接口相关的单元测试、文档生成等实用技能。但是,这些内容还不足以帮助我们构建一个动态应用的服务端程序。不论我们是... By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...... Java基础知识点梳理 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法... 记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程... 哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈... 你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能... Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以We... Spring1.Spring是什么?有什么好处?2.IOC是什么?有什么好处?具体过程?3.DI是什么?4.IOC和DI的关系?5.bean标签的属性有哪些?6.IOC创建对象有哪几种方式?7.Spr... 本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降... 一直想写一些东西记录自己的成长,以前就是想了又想,不如直接行动起来。 全国人民都盼望着武汉疫情的拐点,我想每个人都没有想到疫情会传播如此的迅速。如果用大数据统计一下医务人员、捐赠物运输车辆、医用...