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

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

在这篇文章中。我们将探讨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. 轻松学习JavaScript十二:JavaScript基于面向对象之创建对象(一)

    这一次我们深入的学习一下JavaScript面向对象技术,在学习之前,必要的说明一下一些面向对象的一些术语. 这也是全部面对对象语言所拥有的共同点.有这样几个面向对象术语: 对象 ECMA-262把对 ...

  2. JAVA程序设计(11)-----面对对象0基础设计 麻将 创建麻将牌 然后洗牌 发牌~ 恩 就这样

    zzzzZZZZ 1.開始还想贴图的 实在太懒了-- 这是一张麻将 package com.lovo; import java.awt.Graphics; import java.awt.Image; ...

  3. EasyUI----动态拼接EasyUI控件

    近期在做的项目中.依据查询到的数据,然后动态的拼接easyUI的控件显示到界面上. 在数据库中,有一个命令的表,另一个參数的表,先到命令的表中去查询这一个设备有哪些命令,比方说.摄像头有一个转动的命令 ...

  4. 2017-3-3 leetcod 1 35 448

    ACM退役了,接下来是考研的准备,刷刷leetcode保证不会生手,也算是调剂生活,初步计划是每天三题吧,希望可以坚持下去. 打算按照专题来做,先是Array....本来以为特别水,结果.... == ...

  5. oracle (9I/10G/11G)数据库日志挖掘(审计误操作)

    文档结构: 资料来自官方网站: https://docs.oracle.com/cd/E11882_01/server.112/e22490/logminer.htm#SUTIL019 来自论坛: h ...

  6. Flask Cookie和Session

    1.1.概念 cookie:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了解决这个问题,第 ...

  7. BZOJ 3195 DP

    http://www.cnblogs.com/CXCXCXC/p/5093584.html //By SiriusRen #include <cstdio> using namespace ...

  8. mybatis通用的crud的接口

    http://git.oschina.net/jrl/mybatis-mapper https://www.oschina.net/p/mybatis-plus

  9. C# 3.0的新特性

    自动属性. 之前定义属性的步骤: private filed + public property. 现在的形式:int id{get;set;}. 可以分别设置get/set的保护级别(protect ...

  10. DIV水平方向居中的几种方法

    一.使用margin: 1 #center0 { 2 background: red; 3 margin: 0 auto; 4 } 或者: margin: auto; 这样的前提是父盒子里没有其他盒子 ...