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\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编译此程序:
# |
使用mount命令带“mand”參数来又一次挂载根文件系统,例如以下所看到的。
这将在文件系统级别使能强制锁功能。
注意:你必须切换到root用户才干运行以下的命令。
# |
在可运行的(file_lock所在的)文件夹中创建两个名为“advisory.txt”和“mandatory.txt”的文件。对于“mandatory.txt”使能Set-Group-ID。同一时候不使能Group-Execute-Bit。例如以下所看到的:
### |
測试协同锁:运行演示样例程序,以“advisory.txt”作为參数。
# |
此程序将等待用户的输入。从还有一个终端或控制台,尝试输入下面命令行:
# |
在上面的样例中,ls命令会将其输出写入到advisory.txt文件中。即使我们获得了一个写入锁,仍然会有一些进程(非合作)可以往文件中写入数据。
这就是所谓的“协同”锁。
測试强制锁:再次运行演示样例程序。以“mandatory.txt”作为參数。
# |
从还有一个终端或控制台。尝试输入下面命令行:
# |
在上面的样例中。ls命令在将其输出写入到mandatory.txt文件之前。会等待文件锁被删除。尽管它仍然是一个非合作进程。但强制锁起了作用。
Linux以下的两种文件锁的更多相关文章
- Linux中的两种守护进程stand alone和xinetd
Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...
- Linux共享库两种加载方式简述
Linux共享库两种加载方式简述 动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...
- Linux 服务管理两种方式service和systemctl
Linux 服务管理两种方式service和systemctl 1.service命令 service命令其实是去/etc/init.d目录下,去执行相关程序 # service命令启动redis脚本 ...
- python执行linux命令的两种方法
python执行linux命令有两种方法: 在此以Linux常用的ls命令为例: 方法一:使用os模块 1 2 3 shell# python >> import os >> ...
- Mac Item2 SSH免密登录Linux 服务器的两种方式
转自http://blog.csdn.net/jobschen/article/details/52823980 mac ssh登录linux服务器 的两种方式: 个人推荐第二种,zsh方式,只需要把 ...
- Linux驱动的两种加载方式过程分析
一.概念简述 在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新 ...
- Linux驱动的两种载入方式过程分析
一.概念简述 在Linux下能够通过两种方式载入驱动程序:静态载入和动态载入. 静态载入就是把驱动程序直接编译进内核.系统启动后能够直接调用.静态载入的缺点是调试起来比較麻烦,每次改动一个地方都要又一 ...
- Linux下的两种磁盘分区工具的使用
如何使用fdisk和parted分区工具来进行硬盘分区,下面我来说一下在Linux系统中这两种硬盘分区工具的使用方法: ----------fdisk分区工具---------- ...
- Linux 下的两种分层存储方案
背景介绍 随着固态存储技术 (SSD),SAS 技术的不断进步和普及,存储介质的种类更加多样,采用不同存储介质和接口的存储设备的性能出现了很大差异.SSD 相较于传统的机械硬盘,由于没有磁盘的机械转动 ...
随机推荐
- 解决Unity的 The file 'MemoryStream' is corrupted! Remove it and launch 崩溃问题
孙广东 2015.7.30 问题: 在项目平时删除资源或者脚本资源时产生的prefab的脚本引用丢失,特别是在场景scene中丢了解决方式/// 1.又一次Clone项目/// 2.删除项目的 ...
- CSDN--十年
昨天获得了博客专家的勋章,惊喜总是来的有点意外.这个勋章也算是来的一波三折.借着这个机会,回首一下我在CSDN的博客历史. 这个博客如今可查的最早的文章,是04年下半年写的,事实上之前应该另一些自己写 ...
- awesome-free-software
Free software is distributed under terms that allow users to run the program for any purpose, study ...
- java 正则表达式(一)
1匹配验证-验证Email是否正确 Java | 复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public static void main(String[] args) ...
- hdoj--3367--Pseudoforest(伪森林&&最大生成树)
Pseudoforest Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- 10.QT程序框架与connect
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setup ...
- ROS-单目摄像头标定
前言:由于摄像图内部与外部的原因,生成的图像往往会发生畸变,为了避免数据源造成的误差,需要针对摄像头的参数进行标定. ros官方提供了camera_calibration软件包进行摄像头标定. 一.安 ...
- BZOJ 4184 线段树+高斯消元
思路: 线段树表示的是时间 每回最多log个段 区间覆盖 一直到叶子 的线性基 xor 一下 就是答案 一开始没有思路 看了这篇题解 豁然开朗 http://www.cnblogs.com/joyou ...
- HD-ACM算法专攻系列(23)——Crixalis's Equipment
题目描述: AC源码:此次考察贪心算法,解题思路:贪心的原则是使留下的空间最大,优先选择Bi与Ai差值最大的,至于为什么?这里用只有2个设备为例,(A1,B1)与(A2,B2),假设先搬运A1,搬运的 ...
- 读书笔记之《HTML5 与 CSS3 基础教程》
1· 读前预期 考虑到对于 Web 开发零基础,凡涉足一件未知的任务,最好先理清任务的逻辑结构,然后有目的地逐步学习.为实现我们的需求和设计,必须要学习前端.后端.服务器等一系列暂时陌生的知识,在此, ...