http://blog.csdn.net/elfprincexu/article/details/43564425

文件锁(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 文件

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. int main(int argc, char **argv) {
  4. if (argc > 1) {
  5. int fd = open(argv[1], O_WRONLY);
  6. if(fd == -1) {
  7. printf("Unable to open the file\n");
  8. exit(1);
  9. }
  10. static struct flock lock;
  11. lock.l_type = F_WRLCK;
  12. lock.l_start = 0;
  13. lock.l_whence = SEEK_SET;
  14. lock.l_len = 0;
  15. lock.l_pid = getpid();
  16. int ret = fcntl(fd, F_SETLKW, &lock);
  17. printf("Return value of fcntl:%d\n",ret);
  18. if(ret==0) {
  19. while (1) {
  20. scanf("%c", NULL);
  21. }
  22. }
  23. }
  24. }

然后编译文件gcc

  1. # cc -o file_lock file_lock.c

重新挂载文件系统,当然,必须以root身份才可以挂载,

  1. # mount -oremount,mand /

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

  1. # touch advisory.txt
  2. # touch mandatory.txt
  3. # chmod g+s,g-x mandatory.txt

测试:

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

1. 测试 advisory.txt 文件

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

  1. # ./file_lock advisory.txt

这个程序会等待用户的输入,我们另开一个terminal, 并且输入以下命令:

# ls >>advisory.txt

在上面的例子中, ls 命令会把当前的名录文件信息全部写入到 advisory.txt文件中,尽管我们的file_lock程序中尝试获得write 写文件锁,但 ls 依然可以写入。

2. 测试 mandatory.txt 文件

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

  1. # ./file_lock mandatory.txt

这个程序会等待用户的输入,我们另开一个terminal, 并且输入以下命令:

# ls >>mandatory.txt

在上面的例子中, ls 命令会把当前的名录文件信息全部写入到 advisory.txt文件中,和上面例子不同的在于,ls 命令会等待我们的file_lock 程序退出才写入文件中,尽管ls 进程仍然是个不合作进程,但是强制性文件锁迫使它遵守规则。

mandatory and advisory文件锁(File Lock)的更多相关文章

  1. 启动受管服务器出现:unable to get file lock, will retry...

    启动受管服务器出现:unable to get file lock, will retry... 解决方法:一.删掉Domain下的*.lok文件1. 删除edit.lok进入到domain_home ...

  2. <BEA-141281> <unable to get file lock, will retry ...> --reference

    I ran into this error the first time I restarted Weblogic on one of my installs, the only reference ...

  3. 启动weblogic11g一直提示<141281> <unable to get file lock, will retry ...>

    一次非正常关闭weblogic之后,再次启动时启动不成功,一直提示:<141281> <unable to get file lock, will retry ...> 解决方 ...

  4. 【从翻译mos文章】Weblogic AdminServer 启动fail,报错&quot;unable to get file lock, will retry&quot;

    Weblogic AdminServer 启动fail,报错"unable to get file lock, will retry" 参考原始: Weblogic AdminSe ...

  5. 15-5-23 下午02时22分58秒 CST> <Info> <Management> <BEA-141281> <unable to get file lock, will retry ...>

     A-141281> <unable to get file lock, will retry ...>   http://gdutlzh.blog.163.com/blog/s ...

  6. 【记录】文件加密软件 Gilisoft File Lock Pro v11.0 中文注册版

    ---恢复内容开始--- GiliSoft File Lock Pro 是一款优秀的加密工具,用它可以隐藏或加密文件.文件夹.磁盘分区,而且被加密的文件不会因为被加密(忘记密码)而丢失,可算是很安全的 ...

  7. kafka.common.KafkaException: Failed to acquire lock on file .lock in /tmp/kafka-logs. A Kafka instance in another process or thread is using this directory.

    1.刚才未启动zookeeper集群的时候,直接启动kafka脚本程序,kafka报错了,但是进程号启动起来来,再次启动出现如下所示的问题,这里先将进程号杀死,再启动脚本程序. [hadoop@sla ...

  8. 解决Warning Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.

    系统:Ubuntu 16.04 LTS 环境:vscode+java extension pack打开了一个gradle的java项目:另外,用一个terminal启动了groovysh 报错: gr ...

  9. Failed to acquire lock on file .lock in /tmp/kafka-logs. A Kafka instance in another process or thread is using this directory.

    1. 问题现象 启动 kafka 时报错:Failed to acquire lock on file .lock in /tmp/kafka-logs. A Kafka instance in an ...

随机推荐

  1. 比较实用的前端 js框架 ,组件 汇总

    一.js 前端ui框架 Kendo UI 商用收费,组件丰富,界面简洁美观,有jQuery和angular两个js的版本 Webix 商用收费,组件丰富,界面特别美观 JQwidgets 商用收费,丰 ...

  2. topcoder srm 510 div1

    problem1 link 令$f(x)$表示[0,x]中答案的个数.那么题目的答案为$f(b)-f(a-1)$ 对于$f(x)$来说,假设$x$有$d$位数字,即$[0,d-1]$,那么可以进行动态 ...

  3. Restful framework【第十一篇】url路由控制

    基本使用 -url控制 -传统的url配置 url(r'^books/$', views.BookView.as_view()), url(r'^books/(?P<pk>\d+)$', ...

  4. for和while循环的区别

    区别:for循环,就是遍历某一对象,通俗说就是根据循环次数限制做多少次重复操作.while循环,是当满足什么条件的时候,才做某种操作. for为遍历循环 while为直到循环

  5. <Python>判断变量是否是DataFrame 或者 Series

    https://stackoverflow.com/questions/14808945/check-if-variable-is-dataframe Use the built-in isinsta ...

  6. (转)JPA & Restful

    参考博客: JPA: https://www.jianshu.com/p/b6932740f3c0 https://shimo.im/docs/zOer2qMVEggbF33d/ Restful: h ...

  7. Component 组件props 属性设置

    props定义属性并获取属性值 html <div id="app"> <!-- 注册一个全局逐渐 --> <!-- 注意如果自定义的属性带-像下面这 ...

  8. [JavaScript] - replaceAll,将字符串中的字母或数字等全部替换掉的方式

    原题 function DNAtoRNA(dna) { // create a function which returns an RNA sequence from the given DNA se ...

  9. 【C#】委托的发展

    "用事件去处理程序, 进而解决问题" ---- 委托的目的 委托早在C#2的时候就已经初具模型, 但是并不是特别灵活, 制止C#3才在代码中被广泛使用. C#4中泛型委托, C#5 ...

  10. VHDL 例程

    以下程序未经仿真,仅供说明 语法 声明参考库ieee,使用ieee中的std_logic_1164包全部条目可见 library ieee; use ieee.std_logic_1164.all; ...