mandatory and advisory文件锁(File Lock)
http://blog.csdn.net/elfprincexu/article/details/43564425
文件锁(File Lock)是一种在特定的时间内只允许一个进程进行访问文件的机制,通过使用文件锁,可以使得多进程访问文件更加安全。
在这片文章中,我们会探索两种不同的文件锁,并且通过实际案例去了解他们的机制和不同之处。
我们会举以下两个例子来解释为什么文件锁(file lock)是必须的
- 进程A打开并且读一个文件,这个文件关于账户信息
- 进程B此时也打开并且读这个相同的文件。
- 现在,进程A改变了一条记录,并且把改变写入了这个相同的文件内
- 进程B却无法知晓这个文件已经被改变了,这个时候进程B也做了相同记录改变的事情,把它的改变也写入了这个文件内
- 现在,这个文件只包含了进程B所做的改变
为了避免这类问题的发生,我们使用文件锁(file lock)来使进程串列化。
转载文章,请注明出处: http://blog.csdn.net/elfprincexu
接下来我们介绍两种linux的文件锁(advisory尝试性文件锁和mandatory强制性文件锁)
1. Advisory Locking
尝试性文件锁需
要各个进程的无私合作,试想A进程获得一个 写 的文件锁,它开始往文件里写操作。
同时B进程,却没有去尝试获取写操作,它也同样可以进行写操作。但是很显然,B进程违反了游戏规则。我们称之为不合作进程。
尝试性文件锁,需要各个进程遵守统一规则,在文件访问时,都要礼貌的去尝试获得文件锁,然后进一步操作。
2.Mandatory Locking
强制性文件锁不需要进程的合作,强制性文件锁是通过内核强制检查文件的打开,读写操作是否符合文件锁的使用规则。
为了是强制性文件锁工作,我们必须要在文件系统上激活它,必要的操作包括
- 挂载mount文件系统,通过 “-o mand”参数选项
- 对于文件锁施加的文件,打开 set-group-id 位,并且关闭 group-execute 位。我们必须选择这种顺序,因为你一旦关闭 group-execute 位,set-group-id 就没有意义了
Linux 系统下文件锁的实际案例
为了了解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;
- lock.l_pid = getpid();
- int ret = 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
重新挂载文件系统,当然,必须以root身份才可以挂载,
- # mount -oremount,mand /
新建两个新的文件,一个 “advisory.txt”, 另一个为 “mandatory.txt”文件,同时对“mandatory.txt” 文件开启 set-group-id 位,关闭 group-execute 位。
- # touch advisory.txt
- # touch mandatory.txt
- # chmod g+s,g-x mandatory.txt
测试:
转载文章,请注明出处: http://blog.csdn.net/elfprincexu
1. 测试 advisory.txt 文件
现在运行刚才编译 file_lock 可执行文件,
- # ./file_lock advisory.txt
这个程序会等待用户的输入,我们另开一个terminal, 并且输入以下命令:
- # ls >>advisory.txt
在上面的例子中, ls 命令会把当前的名录文件信息全部写入到 advisory.txt文件中,尽管我们的file_lock程序中尝试获得write 写文件锁,但 ls 依然可以写入。
2. 测试 mandatory.txt 文件
现在运行刚才编译 file_lock 可执行文件,
- # ./file_lock mandatory.txt
这个程序会等待用户的输入,我们另开一个terminal, 并且输入以下命令:
- # ls >>mandatory.txt
在上面的例子中, ls 命令会把当前的名录文件信息全部写入到 advisory.txt文件中,和上面例子不同的在于,ls 命令会等待我们的file_lock 程序退出才写入文件中,尽管ls 进程仍然是个不合作进程,但是强制性文件锁迫使它遵守规则。
mandatory and advisory文件锁(File Lock)的更多相关文章
- 启动受管服务器出现:unable to get file lock, will retry...
启动受管服务器出现:unable to get file lock, will retry... 解决方法:一.删掉Domain下的*.lok文件1. 删除edit.lok进入到domain_home ...
- <BEA-141281> <unable to get file lock, will retry ...> --reference
I ran into this error the first time I restarted Weblogic on one of my installs, the only reference ...
- 启动weblogic11g一直提示<141281> <unable to get file lock, will retry ...>
一次非正常关闭weblogic之后,再次启动时启动不成功,一直提示:<141281> <unable to get file lock, will retry ...> 解决方 ...
- 【从翻译mos文章】Weblogic AdminServer 启动fail,报错"unable to get file lock, will retry"
Weblogic AdminServer 启动fail,报错"unable to get file lock, will retry" 参考原始: Weblogic AdminSe ...
- 15-5-23 下午02时22分58秒 CST> <Info> <Management> <BEA-141281> <unable to get file lock, will retry ...>
A-141281> <unable to get file lock, will retry ...> http://gdutlzh.blog.163.com/blog/s ...
- 【记录】文件加密软件 Gilisoft File Lock Pro v11.0 中文注册版
---恢复内容开始--- GiliSoft File Lock Pro 是一款优秀的加密工具,用它可以隐藏或加密文件.文件夹.磁盘分区,而且被加密的文件不会因为被加密(忘记密码)而丢失,可算是很安全的 ...
- kafka.common.KafkaException: Failed to acquire lock on file .lock in /tmp/kafka-logs. A Kafka instance in another process or thread is using this directory.
1.刚才未启动zookeeper集群的时候,直接启动kafka脚本程序,kafka报错了,但是进程号启动起来来,再次启动出现如下所示的问题,这里先将进程号杀死,再启动脚本程序. [hadoop@sla ...
- 解决Warning Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.
系统:Ubuntu 16.04 LTS 环境:vscode+java extension pack打开了一个gradle的java项目:另外,用一个terminal启动了groovysh 报错: gr ...
- Failed to acquire lock on file .lock in /tmp/kafka-logs. A Kafka instance in another process or thread is using this directory.
1. 问题现象 启动 kafka 时报错:Failed to acquire lock on file .lock in /tmp/kafka-logs. A Kafka instance in an ...
随机推荐
- H5、React Native、Native性能区别选择
“存在即合理”.凡是存在的,都是合乎规律的.任何新事物的产生总要的它的道理:任何新事物的发展总是有着取代旧事物的能力.React Native来的正是时候,一则是因为H5发展到一定程度的受限:二则是移 ...
- upc组队赛1 黑暗意志【stl-map】
黑暗意志 题目描述 在数千年前潘达利亚从卡利姆多分离之时,迷雾笼罩着这块新形成的大陆,使它不被外来者发现.迷雾同样遮蔽着这片大陆古老邪恶的要塞--雷神的雷电王座.在雷神统治时期,他的要塞就是雷电之王力 ...
- How to Use GNOME Shell Extensions
如果没有安装Tweaks请先安装,命令如下: sudo apt install gnome-tweak-tool 1. Use gnome-shell-extensions package [easi ...
- [quartz] - Cron表达式举例
Quartz是一个任务调度框架.比如你遇到这样的问题 想每月25号,信用卡自动还款 想每年2月14日自己给当年暗恋女神发一封匿名贺卡 想每隔1小时,备份一下自己的SpringCloud学习笔记到云盘 ...
- 【Ruby】【YAML】
require "YAML" var = YAML.load(File.open('b.yml')) #哈希puts var.class #Hashprint var ," ...
- 【Python】【有趣的模块】【requests】【二】快速上手
[一]参数及结果 [二]响应内容 >>> r = requests.get('https://github.com/timeline.json') >>> prin ...
- 八皇后问题 递归实现 C语言 超详细 思路 基础
八皇后问题 :假设 將八个皇后放到国际象棋盘上,使其两两之间无法相互攻击.共有几种摆法? 基础知识: 国际象棋里,棋盘为8X8格. 皇后每步可以沿直线.斜线 走任意格. 思路: 1.想把8个皇后放进去 ...
- XML简单入门
1.xml文件的第一句为<?xml version="1.0" ?> xml 1.0版本和1.1版本有较大不同,且1.1版本向下不可兼容,故使用version 1.0 ...
- Jtest的简单使用
Jtest主要用于快速测试自己的代码是否正确 条件,导入相应的Jtest包 @Test public void test() { System.out.println(" ...
- 分组查询以及having使用
Group by 注意事项:对查询的列有限制,除了聚合函数外,就必须是分组的项 order by总是放在最后 代码示例: select Gender as 性别 ,count (Gender) a ...