zoukankan      html  css  js  c++  java
  • mandatory and advisory文件锁(File Lock)

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


    然后编译文件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 进程仍然是个不合作进程,但是强制性文件锁迫使它遵守规则。

  • 相关阅读:
    python-学习 补充模块;面向对象程序设计
    python学习- 常用模块与re正则
    python-学习 协程函数 模块与包
    python-学习 初级atm小脚本、函数嵌套、装饰器、生成器、迭代器、三元表达式
    模拟登陆古诗文网
    正则表达式(括号)、[中括号]、{大括号}的区别
    MongoDB的基本操作
    语音合成以及语音识别
    flask中的CBV,flash,Flask-Session,WTForms
    Flask基础2 蓝图,实例化配置,app对象配置,特殊装饰器
  • 原文地址:https://www.cnblogs.com/mull/p/8179306.html
Copyright © 2011-2022 走看看