《第七章》 数据管理 --之 文件锁定

来源:互联网 发布:声音改变软件 编辑:程序博客网 时间:2024/04/29 16:29
文件锁定是多用户多任务OS中非常重要的部分。
 *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 就是一个
  索引化的文件存储系统。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 输入农行卡三次怎么办 花呗支付超限怎么办 在商场买到破衣服怎么办 vans鞋子磨脚怎么办 衣服白领子发黄怎么办 白衬衣染上黑色怎么办 车超过年检日期怎么办 用过期卫生间痒怎么办 驾照过期一个礼拜怎么办 月经总是后漏怎么办 护垫掉厕所里怎么办 健身房老板拿钱跑了怎么办 手机游戏变竖屏了怎么办 轮胎钢圈处磨损怎么办 屋里有刺鼻气味怎么办 脸上都是荧光剂怎么办 mac系统卡死了怎么办 笔记本关机要很久怎么办 mac关不了机怎么办 mac蓝屏无法开机怎么办 凤凰系统内存小怎么办 proe安装完成打不开怎么办 绿叶竹根发黑怎么办 月经期间肚子凉怎么办 来月经肚子冷怎么办 月经越来越少了怎么办 卫生巾闷出红疹子痒怎么办 开动物检疫证明怎么办 打桩机钻头掉了怎么办 临牌怎么办没有合格证 没有合格证怎么办零牌 贴了一等品瓷砖怎么办 香港过关货物被退港怎么办 换检验标过期怎么办 电动车合格证丢了怎么办 摩托车合格证丢了怎么办 鞋子潮湿有味道怎么办 衣服泡臭了怎么办 养金毛家里味大怎么办 衣服脱色怎么办怎么洗 过了淘宝售后怎么办