[Linux] 第七章 数据管理 - 文件锁定
文件锁定是多用户多任务OS中非常重要的部分。
*1,程序经常需要共享数据,这通常是通过文件来实现的。
当一个程序正在对文件进行write操作,文件就会进入一个暂时状态,
在这个状态下,如果另外一个程序尝试读这个文件,它就会自动停下来
等待这个状态的结束。
*2,Linux提供了多种特性来实现文件锁定。其中最简单的方法
方法一 :就是以”原子操作“ 的方式创建锁文件。就是创建锁文件时,系统将
不允许其他的事情发生。
方法二 :允许程序锁定文件的一部分,从而可以独享对这一部分内容的访问。
创建锁文件
许多应用程序只需要能够针对某一个资源创建一个锁文件就可以了!
锁文件只是建议锁,并不是强制锁。
创建 : <funt1.h> open(), O_CREAT O_EXCL
** : 协调性锁文件
这是一个进程间协调性的安排,你必须正确地编写代码以使其正常工作,意识到这一
点很重要。当程序创建锁文件失败时,它不能通过删除文件并重新尝试的方法来解决
此问题。或许这样做可以创建锁文件,但是另一个创建锁文件的程序将无法得知它已
经不再拥有对这个资源的独占式访问权了。
** 区域锁定 **
用创建锁文件的方法来控制不经常访问的文件之类的资源的独占式访问,是一个不错的选择
,但它并不适用于访问大型的共享文件。文件区域锁定 : 多使用 fcntl 系统调用。
#include <fcntl.h>
int fcntl(int files, int command, ...);
F_RDLCK 共享(或读)锁
F_UNLCK 解锁
F_WRLCK 独占(或写)锁
文件中的每个字节在任一时刻只能拥有一种类型的锁 : 共享锁,独占锁或解锁。
fcntl 的命令和选项的组合相当多。
** 锁定状态下的读写操作
当对文件区域加锁之后,你必须使用底层的read和write调用来访问文件中的数据。
** 文件锁的竞争
两个程序争夺文件同一区域上的锁时会发生什么情况。
** 死锁
比如 : 两个程序想要更新同一文件,他们需要同时更新文件中的字节1和字节2.
程序A选择首先更新字节2,然后再更新字节1
程序B选择首先更新字节1,然后再更新字节2
两个程序同时启动,A锁2,B锁1,然后A尝试锁定字节1,但是因为这个字节已经被B
锁定,所以 A 只能在那里等待!B也同理在等待。
dbm数据库
dbm数据库适合于存储相对比较静态的索引化数据。 其实 dbm 就是一个
索引化的文件存储系统。
*1,程序经常需要共享数据,这通常是通过文件来实现的。
当一个程序正在对文件进行write操作,文件就会进入一个暂时状态,
在这个状态下,如果另外一个程序尝试读这个文件,它就会自动停下来
等待这个状态的结束。
*2,Linux提供了多种特性来实现文件锁定。其中最简单的方法
方法一 :就是以”原子操作“ 的方式创建锁文件。就是创建锁文件时,系统将
不允许其他的事情发生。
方法二 :允许程序锁定文件的一部分,从而可以独享对这一部分内容的访问。
创建锁文件
许多应用程序只需要能够针对某一个资源创建一个锁文件就可以了!
锁文件只是建议锁,并不是强制锁。
创建 : <funt1.h> open(), O_CREAT O_EXCL
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <errno.h> int main() { int flag; int save_error; flag = open("/home/hp/linux/7file.txt", O_RDWR | O_CREAT | O_EXCL); if(flag == -1) { save_error = errno; printf("Open failed with error %d\n", save_error); } else { printf("Open succeeded\n"); } exit(EXIT_SUCCESS); }//"+yG复制的,并没有按v.
** : 协调性锁文件
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <errno.h> const char *lock_file = "/home/hp/linux/LCK.test2"; int main() { int flag; int ca = 5; while(ca--) { flag = open(lock_file, O_RDWR | O_CREAT | O_EXCL); if(flag == -1) { printf("%d - Lock already present\n", getpid()); sleep(3); } else { printf("%d - I have exclusive access\n", getpid()); sleep(1); (void)(close(flag)); (void)(unlink(lock_file)); sleep(2); } } exit(EXIT_SUCCESS); }很好,我很明白!很好!
这是一个进程间协调性的安排,你必须正确地编写代码以使其正常工作,意识到这一
点很重要。当程序创建锁文件失败时,它不能通过删除文件并重新尝试的方法来解决
此问题。或许这样做可以创建锁文件,但是另一个创建锁文件的程序将无法得知它已
经不再拥有对这个资源的独占式访问权了。
** 区域锁定 **
用创建锁文件的方法来控制不经常访问的文件之类的资源的独占式访问,是一个不错的选择
,但它并不适用于访问大型的共享文件。文件区域锁定 : 多使用 fcntl 系统调用。
#include <fcntl.h>
int fcntl(int files, int command, ...);
F_RDLCK 共享(或读)锁
F_UNLCK 解锁
F_WRLCK 独占(或写)锁
文件中的每个字节在任一时刻只能拥有一种类型的锁 : 共享锁,独占锁或解锁。
fcntl 的命令和选项的组合相当多。
** 锁定状态下的读写操作
当对文件区域加锁之后,你必须使用底层的read和write调用来访问文件中的数据。
** 文件锁的竞争
两个程序争夺文件同一区域上的锁时会发生什么情况。
** 死锁
比如 : 两个程序想要更新同一文件,他们需要同时更新文件中的字节1和字节2.
程序A选择首先更新字节2,然后再更新字节1
程序B选择首先更新字节1,然后再更新字节2
两个程序同时启动,A锁2,B锁1,然后A尝试锁定字节1,但是因为这个字节已经被B
锁定,所以 A 只能在那里等待!B也同理在等待。
dbm数据库
dbm数据库适合于存储相对比较静态的索引化数据。 其实 dbm 就是一个
索引化的文件存储系统。