Linux 文件锁
当多个进程同时访问操作同一个文件时,我们怎么保证文件数据的正确性。
linux通常采用的方法是文件上锁,来避免共享资源的产生竞争状态。
文件锁包括建议性锁和强制性的锁:
建议性的锁 :顾名思义,相对温柔一些,在对文件进行锁操作时,会检测是否已经有锁存在,并且尊重已有的锁。在一般的情况下,内核和系统都不使用建议锁。
强制性锁 :由内核执行的锁,当一个文件被上锁进行写入操作的时候, 内核将阻止其他进程进行读写操作。采用强制性的锁对系统的性能影响很大,每次进行读写操作都必须 检查是否有所存在。
在linux中对文件进行锁操作,可以使用lockf()和fcntl()这两个函数:
前者对文件施加建议性锁,后者为两种锁都行。另外fcntl还可以对文件的某一记录上锁。
fcntl函数原型:
int fcntl( int fd, int cmd, struct flock *lock );
fd为文件描述符
cmd为一些命令参数
flcok结构体用来设置记录锁的具体状态。
fcntl() 对已打开的文件描述符进行操作,并根据命令参数的不同能够执行不同的任务。
关于文件锁的几个命令选项如下:
F_GETLK 根据lock参数值,决定是否上文件锁
F_SETLK 设置lock参数值的文件锁
F_SETLKW 这是 F_GETLK的阻塞版本,在无法获取锁时,会进入睡眠状态
- flock结构体的定义如下:
struct flock {
short l_type;
off_t l_start;
short l_whence;
off_t l_len;
pid_t l_pid;
}
l_type有三个选项:
F_RDLCK : 共享锁,只读用
F_WRLCK : 独占锁(写操作锁)
F_UNLCK : 解除锁定
l_start 为相对位移量
l_whence 必须是以下几个值之一( 在 unistd.h 中定义):
SEEK_SET : 文件开始位置
SEEK_CUR: 文件当前位置
SEEK_END: 文件末尾位置
l_len 加锁的长度
l_pid当前文件操作的进程id号
文件2 test01.c,代码如下:
{
FILE *fp = NULL;
int i = ; //20秒时间
//打开文件
if ((fp = fopen("./test.ok", "r+b")) == NULL)
printf("file open error!\n"); //给该文件加锁
if (flock(fp->_fileno, LOCK_EX) != )
printf("file lock by others\n"); //进入循环,加锁时间为20秒,打印倒计时
while()
{
printf("%d\n", i--);
sleep();
if (i == )
break;
} //20秒后退出,关闭文件
fclose(fp); //文件解锁
flock(fp->_fileno, LOCK_UN);
return ;
}
文件2 test02.c,代码如下:
#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h> int main(void)
{
FILE *fp = NULL;
int i = ;
//打开文件
if ((fp = fopen("./test.ok", "r+b")) == NULL)
printf("file open error!\n"); flock(fp->_fileno, LOCK_EX); //文件加锁 while() //进入循环
{
printf("%d\n", i++);
sleep();
} fclose(fp); //关闭文件 flock(fp->_fileno, LOCK_UN); //释放文件锁 return ;
}
首先运行test01.c,紧接着运行test02.c(运行test01.c后20秒内要运行test02.c否则看不到现象)
现象:
test01.c执行起来以后,开始倒计时。
此时运行test02.c会阻塞在加锁处。
当test01.c运行20秒后关闭文件,并释放文件锁后,test02.c会开始运行。
测试:
1.************************************
2.************************************************
测试竟然不成功。
Linux 文件锁的更多相关文章
- Linux文件锁flock
Linux文件锁flock 在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock. flock,建议性锁 ...
- linux文件锁flock【转】
转自: https://www.cnblogs.com/kex1n/p/7100107.html linux文件锁flock 在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要 ...
- 每天进步一点点——Linux文件锁编程flock
转载请注明出处:http://blog.csdn.net/cywosp/article/details/30083015 1. 场景概述 在多线程开发中.相互排斥锁能够用于对临界资源的保护,防 ...
- Linux文件锁学习-flock, lockf, fcntl
参考 linux中fcntl().lockf.flock的区别 这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是f ...
- linux文件锁的应用,POSIX,unix标准,linux标准
1. perl,flock加锁.java也能加锁. 2. 先创建文件并打开,才能加锁(写打开?). 3. 可以用于判断进程是否一直在运行(用另一进程判断),如果锁一直在,则进程在:锁不在,则原进程或意 ...
- Linux文件锁【转】
本文转载自:http://blog.csdn.net/dragon_li_chen/article/details/17147911 一.文件锁的分类: 翻阅参考资料,你会发现文件锁可以进行很多的分类 ...
- linux 文件锁flock,lockf,fcntl
1.flock,lockf,fcntl之间区别 先上结论:flock是文件锁,锁的粒度是整个文件,就是说如果一个进程对一个文件加了LOCK_EX类型的锁,别的进程是不能对这个文件加锁的. lockf是 ...
- linux文件锁
http://blog.chinaunix.net/uid-25324849-id-3077304.html 在SHELL中实现文件锁,有两种简单的方式.(1)一是利用普通文件,在脚本启动时检查特定文 ...
- Linux文件锁flock ,检测进程是否已经存在
在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock. 头文件:#include<sys/fil ...
随机推荐
- raw_input 和input的区别
input它会根据用户输入变换相应的类型, raw_input则是不管用户输入什么类型的都会转变成字符型.
- IOS学习笔记34—EGOTableViewPullRefresh实现下拉刷新
移动应用开发中有这么一种场景,就是在列表中显示的数据刷新,有点击刷新按钮刷新的,也有现在最流行的由Twitter首先推出的下拉刷新功能,在IOS中,使用下拉刷新更新UITableView中的数据也用的 ...
- 抓包工具PowerSniff-0.1
做这个程序的意图是wireshark插件编写复杂(虽然也支持lua),而轻量级的工具如smartsniff,minisniff不支持插件化数据分析,各种工具用下来或多或少不顺手.以前写的外挂也都是手工 ...
- Android多媒体分析-通过MediaStore获取Audio信息
public void getAlldata() { ContentResolver cr = getApplication().getContentResolver(); if (cr == nul ...
- [内核同步]Linux内核同步机制之completion
转自:http://blog.csdn.net/bullbat/article/details/7401688 内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束.这个活动 ...
- BlockingQueue深入分析
1.BlockingQueue定义的常用方法如下 抛出异常 特殊值 阻塞 超时 插入 add(e) offer(e) put(e) offer(e,time,unit) 移除 remove() p ...
- python3爬虫 url管理器
import urllib.request #python3中将urllib2拆分为了urllib.request.urllib.error.urllib.response等 import http. ...
- CRM 2016 级联过滤
以下以省市为例: function preFilterLookup() { //要进行过滤的lookup按钮加入addPresearch事件 Xrm.Page.getControl("shi ...
- CRM Xrm.Page 的对象层次结构
- Delphi七个版本
第一次Zack Urlocker给我看一款尚未发布的名为Delphi的产品时,我意识到她将改变我的工作—还有许多其他软件开发者的工作. 我过去为使用Windows C++ 库而挣扎,而Delphi过去 ...