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

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

在这篇文章中。我们将探讨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\n");
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\n",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文件之前。会等待文件锁被删除。尽管它仍然是一个非合作进程。但强制锁起了作用。

Linux以下的两种文件锁的更多相关文章

  1. Linux中的两种守护进程stand alone和xinetd

    Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...

  2. Linux共享库两种加载方式简述

      Linux共享库两种加载方式简述  动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...

  3. Linux 服务管理两种方式service和systemctl

    Linux 服务管理两种方式service和systemctl 1.service命令 service命令其实是去/etc/init.d目录下,去执行相关程序 # service命令启动redis脚本 ...

  4. python执行linux命令的两种方法

    python执行linux命令有两种方法: 在此以Linux常用的ls命令为例: 方法一:使用os模块 1 2 3 shell# python >> import os >> ...

  5. Mac Item2 SSH免密登录Linux 服务器的两种方式

    转自http://blog.csdn.net/jobschen/article/details/52823980 mac ssh登录linux服务器 的两种方式: 个人推荐第二种,zsh方式,只需要把 ...

  6. Linux驱动的两种加载方式过程分析

    一.概念简述 在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新 ...

  7. Linux驱动的两种载入方式过程分析

    一.概念简述 在Linux下能够通过两种方式载入驱动程序:静态载入和动态载入. 静态载入就是把驱动程序直接编译进内核.系统启动后能够直接调用.静态载入的缺点是调试起来比較麻烦,每次改动一个地方都要又一 ...

  8. Linux下的两种磁盘分区工具的使用

    如何使用fdisk和parted分区工具来进行硬盘分区,下面我来说一下在Linux系统中这两种硬盘分区工具的使用方法:     ----------fdisk分区工具----------       ...

  9. Linux 下的两种分层存储方案

    背景介绍 随着固态存储技术 (SSD),SAS 技术的不断进步和普及,存储介质的种类更加多样,采用不同存储介质和接口的存储设备的性能出现了很大差异.SSD 相较于传统的机械硬盘,由于没有磁盘的机械转动 ...

随机推荐

  1. Java设计模式透析之 —— 模板方法(Template Method)

    今天你还是像往常一样来上班,一如既往地開始了你的编程工作. 项目经理告诉你,今天想在server端添加一个新功能.希望写一个方法.能对Book对象进行处理.将Book对象的全部字段以XML格式进行包装 ...

  2. Mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)。

    将select出的结果再通过中间表select一遍,这样就规避了错误.注意,这个问题只出现于mysql,mssql和oracle不会出现此问题. mysql中You can't specify tar ...

  3. HDU 5672 String 尺取法追赶法

    String Problem Description There is a string S.S only contain lower case English character.(10≤lengt ...

  4. UVA 11609 - Anne's game cayley定理

    Lily: “Chantarelle was part of my exotic phase.”Buffy: “It’s nice. It’s a mushroom.”Lily: “It is? Tha ...

  5. 避免ANR异常

    避免ANR异常 不要在主线程中执行耗时的代码,不然很容易出现anr错误. 原因: 解决方法:

  6. FastDFS分布式文件系统研究

    FastDFS分布式文件系统 这个主要是针对应用型的,很使用,特别是对于电商等 一.编译安装 ubuntu平台: apt-get install libevent(这个默认就有,没有就装下) libe ...

  7. Ubuntu桌面基础介绍

    1. 目录结构和文件系统 ubuntu的文件系统也是一个又层次的树形结构,文件系统的最上层是 / ,表示根目录,所有其他文件和目录都位于跟目录下,在linux中,一切皆为文件,包括硬盘.分区和拔插介质 ...

  8. windows bat更改系统时间 & 同步internet时间

    最近刚好用到一款软件学习版,30天试用期满,但是还想继续用,不具体透露是什么软件了. 发现更改了系统时间后,这个软件就又能启动了,不过每次改来改去很麻烦,就写了段脚本 @echo off date 1 ...

  9. 38.Qt模型/视图结构

    1.模型/视图类 2.模型 3.视图 4.代理 1 模型/视图类 InterView框架提供了一些可以直接使用的模型类和视图类,如QStandardModel类,QDirModel类,QStringL ...

  10. 如何在ubuntu中安装mysql与mysql workbench

    安装过程如下 sudo apt-get install mysql-server 安装过程中随后设置mysql的密码 之后sudo apt-get install mysql-client 安装好之后 ...