日期:2014-05-16 浏览次数:20761 次
转自 http://blog.jobbole.com/16882/
?
文件锁是一种文件读写机制,在任何特定的时间只允许一个进程访问一个文件。利用这种机制能够使读写单个文件的过程变得更安全。
在这篇文章中,我们将探讨Linux中不同类型的文件锁,并通过示例程序来理解它们之间的不同之处。
我们将采取以下的例子来解释为什么需要使用文件锁。
1、? 进程“A”打开和读取一个文件,此文件包含账户相关的一些信息。
2、? 进程“B”也打开了这个文件,并读取了文件中的信息。
3、? 现在,进程“A”更改了其副本中的一条余额记录,并将其写入文件。
4、? 此时,进程“B”并不知道上次读取的文件已经被更改,它还保存着原始的文件副本。然后,进程“B”更改了“A”操作的那条相同的记录,并将记录写入文件。
5、? 此时,文件中将只保存了进程“B”更改过的记录。
为了避免这种事情发生,就要使用文件锁来确保操作的“序列化”。
?
以下是Linux系统中两种常用的文件锁:
1、? 协同锁
2、? 强制锁
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>
?
int
main(
int
argc,
char
**argv) {
??
if
(argc > 1) {
????
int
fd = open(argv[1], O_WRONLY);
????
if
(fd == -1) {
??????
printf
(
"Unable to open the file\n"
);
??????
exit
(1);
????
}
????
static
struct
flock lock;
?
????
lock.l_type = F_WRLCK;
????
lock.l_start = 0;
????
lock.l_whence = SEEK_SET;
????
lock.l_len = 0;
免责声明: 本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
|