zoukankan      html  css  js  c++  java
  • Linux以下的两种文件锁

    文件锁是一种文件读写机制。在不论什么特定的时间仅仅同意一个进程訪问一个文件。

    利用这样的机制可以使读写单个文件的过程变得更安全。

    在这篇文章中。我们将探讨Linux中不同类型的文件锁,并通过演示样例程序来理解它们之间的不同之处。

    我们将採取下面的样例来解释为什么须要使用文件锁。

    1、  进程“A”打开和读取一个文件,此文件包括账户相关的一些信息。

    2、  进程“B”也打开了这个文件。并读取了文件里的信息。

    3、  如今,进程“A”更改了其副本中的一条剩余金额记录,并将其写入文件。

    4、  此时,进程“B”并不知道上次读取的文件已经被更改。它还保存着原始的文件副本。

    然后。进程“B”更改了“A”操作的那条同样的记录,并将记录写入文件。

    5、  此时。文件里将仅仅保存了进程“B”更改过的记录。

    为了避免这样的事情发生,就要使用文件锁来确保操作的“序列化”。

     

    下面是Linux系统中两种经常使用的文件锁:

    1、  协同锁

    协同锁要求參与操作的进程之间协同合作。

    如果进程“A”获得一个WRITE锁,并開始向文件里写入内容;此时,进程“B”并没有试图获取一个锁,它仍然能够打开文件并向文件里写入内容。

    在此过程中,进程“B”就是一个非合作进程。如果进程“B”试图获取一个锁,那么整个过程就是一个合作的过程,从而能够保证操作的“序列化”。

    仅仅有当參与操作的进程是协同合作的时候,协同锁才干发挥作用。协同锁有时也被称为“非强制”锁。

     

    2、  强制锁

    强制锁不须要參与操作的进程之间保持协同合作。它利用内核来查检每一个打开、读取、写入操作,从而保证在调用这些操作时不违反文件上的锁规则。关于强制锁的很多其它信息,能够在kernal.org上找到。

    为了使能Linux中的强制锁功能。你须要在文件系统级别上打开它。同一时候在单个文件上打开它。其步骤是:

    1、  挂载文件系统时使用“-o mand”參数。

    2、  对于要打开强制锁功能的文件lock_file。必须打开set-group-ID位。关闭group-execute位。

    (选择此方法的原因是,当你关闭group-execute时,设置set-group-ID就没有实际的意义了)

     

    Linux文件锁的演示样例

    为了理解文件锁是怎样工作的。我们建立程序文件file_lock.c:

    include <stdio.h>
    #include <fcntl.h>
     
    intmain(intargc, char**argv) {
      if(argc > 1) {
        intfd = open(argv[1], O_WRONLY);
        if(fd == -1) {
          printf("Unable to open the file
    ");
          exit(1);
        }
        staticstruct flock lock;
     
        lock.l_type = F_WRLCK;
        lock.l_start = 0;
        lock.l_whence = SEEK_SET;
        lock.l_len = 0;
        lock.l_pid = getpid();
     
        intret = fcntl(fd, F_SETLKW, &lock);
        printf("Return value of fcntl:%d
    ",ret);
        if(ret==0) {
          while(1) {
            scanf("%c", NULL);
          }
        }
      }
    }

    #

     用gcc编译此程序:

    # cc -o file_lock file_lock.c

    使用mount命令带“mand”參数来又一次挂载根文件系统,例如以下所看到的。

    这将在文件系统级别使能强制锁功能。

    注意:你必须切换到root用户才干运行以下的命令。

    # mount -oremount,mand /

    在可运行的(file_lock所在的)文件夹中创建两个名为“advisory.txt”和“mandatory.txt”的文件。对于“mandatory.txt”使能Set-Group-ID。同一时候不使能Group-Execute-Bit。例如以下所看到的:

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

    測试协同锁:运行演示样例程序,以“advisory.txt”作为參数。

    # ./file_lock advisory.txt

    此程序将等待用户的输入。从还有一个终端或控制台,尝试输入下面命令行:

    # ls >>advisory.txt

    在上面的样例中,ls命令会将其输出写入到advisory.txt文件中。即使我们获得了一个写入锁,仍然会有一些进程(非合作)可以往文件中写入数据。

    这就是所谓的“协同”锁。

     

    測试强制锁:再次运行演示样例程序。以“mandatory.txt”作为參数。

    # ./file_lock mandatory.txt

    从还有一个终端或控制台。尝试输入下面命令行:

    # ls >>mandatory.txt

    在上面的样例中。ls命令在将其输出写入到mandatory.txt文件之前。会等待文件锁被删除。尽管它仍然是一个非合作进程。但强制锁起了作用。

  • 相关阅读:
    swift 资料
    CI cookie 存放数组
    CI框架中 日志输出方法log_message()只允许输出字符串解决方案
    CI框架整合微信公共平台接口
    php中的 file_get_contents(‘php://input’)
    CI 框架购物车问题
    JQ 报表插件 jquery.jqplot 使用
    微信开发调试工具
    常用开源库
    字符集更改步骤,mysql乱码
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6932162.html
Copyright © 2011-2022 走看看