Linux数据管理——文件锁定
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h> int main()
{
const char *lock_file = "/tmp/LCK.test1";
int n_fd = -1;
int n_tries = 10; while(n_tries--)
{
//创建锁文件
n_fd = open(lock_file, O_RDWR|O_CREAT|O_EXCL, 0444);
if(n_fd == -1)
{
//创建失败
printf("%d - Lock already present\n", getpid());
sleep(2);
}
else
{
//创建成功
printf("%d - I have exclusive access\n", getpid());
sleep(1);
close(n_fd);
//删除锁文件,释放锁
unlink(lock_file);
sleep(2);
}
}
return 0;
}
例如:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h> int main()
{
const char *test_file = "test_lock.txt";
int file_desc = -1;
int byte_count = 0;
char *byte_to_write = "A";
struct flock region_1;
struct flock region_2;
int res = 0; //打开一个文件描述符
file_desc = open(test_file, O_RDWR|O_CREAT, 0666);
if(!file_desc)
{
fprintf(stderr, "Unable to open %s for read/write\n", test_file);
exit(EXIT_FAILURE);
}
//给文件添加100个‘A’字符的数据
for(byte_count = 0; byte_count < 100; ++byte_count)
{
write(file_desc, byte_to_write, 1);
}
//在文件的第10~29字节设置读锁(共享锁)
region_1.l_type = F_RDLCK;
region_1.l_whence = SEEK_SET;
region_1.l_start = 10;
region_1.l_len = 20;
//在文件的40~49字节设置写锁(独占锁)
region_2.l_type = F_WRLCK;
region_2.l_whence = SEEK_SET;
region_2.l_start = 40;
region_2.l_len = 10; printf("Process %d locking file\n", getpid());
//锁定文件
res = fcntl(file_desc, F_SETLK, ®ion_1);
if(res == -1)
{
fprintf(stderr, "Failed to lock region 1\n");
}
res = fcntl(file_desc, F_SETLK, ®ion_2);
if(res == -1)
{
fprintf(stderr, "Failed to lock region 2\n");
}
//让程序休眠一分钟,用于测试
sleep(60);
printf("Process %d closing file\n", getpid());
close(file_desc);
exit(EXIT_SUCCESS);
}
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h> int main()
{
const char *test_file = "test_lock.txt";
int file_desc = -1;
int byte_count = 0;
char *byte_to_write = "A";
struct flock region_1;
struct flock region_2;
int res = 0;
//打开数据文件
file_desc = open(test_file, O_RDWR|O_CREAT, 0666);
if(!file_desc)
{
fprintf(stderr, "Unable to open %s for read/write\n", test_file);
exit(EXIT_FAILURE);
}
//设置区域1的锁类型
struct flock region_test1;
region_test1.l_type = F_RDLCK;
region_test1.l_whence = SEEK_SET;
region_test1.l_start = 10;
region_test1.l_len = 20;
region_test1.l_pid = -1;
//设置区域2的锁类型
struct flock region_test2;
region_test2.l_type = F_RDLCK;
region_test2.l_whence = SEEK_SET;
region_test2.l_start = 40;
region_test2.l_len = 10;
region_test2.l_pid = -1;
//对区域1的是否可以加一个读锁进行测试
res = fcntl(file_desc, F_GETLK, ®ion_test1);
if(res == -1)
{
fprintf(stderr, "Failed to get RDLCK\n");
}
if(region_test1.l_pid == -1)
{
//可以加一个读锁
printf("test: Possess %d could lock\n", getpid());
}
else
{
//不允许加一个读锁
printf("test:Prossess %d get lock failure\n", getpid());
} //对区域2是否可以加一个读锁进行测试
res = fcntl(file_desc, F_GETLK, ®ion_test2);
if(res == -1)
{
fprintf(stderr, "Failed to get RDLCK\n");
}
if(region_test2.l_pid == -1)
{
//可以加一个读锁
printf("test: Possess %d could lock\n", getpid());
}
else
{
//不允许加一个读锁
printf("test:Prossess %d get lock failure\n", getpid());
}
exit(EXIT_SUCCESS);
}
Linux数据管理——文件锁定的更多相关文章
- Linux学习笔记14——使用fcntl实现文件锁定
期末考试快要来了,Linux学习进度一下拉下来许多.今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf.下面主要是fcntl的调用. fcntl函数的原型是:in ...
- Linux大文件已删除,但df查看已使用的空间并未减少解决
在我的生活当中遇到磁盘快满了,这时候准备去删除一些大文件 于是我使用ncdu 查看了一下当前系统占用资源比较多的是那些文件,结果一看是elasticsearch的日志文件,好吧,竟然找到源头了,那就把 ...
- Linux指令--文件和目录属性
对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...
- (转)linux各文件夹的作用
原文地址:<linux各文件夹的作用> linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc. ...
- 【转】第六章、Linux 的文件权限与目录配置
原文网址:http://vbird.dic.ksu.edu.tw/linux_basic/0210filepermission.php 最近更新日期:2009/08/18 Linux最优秀的地方之一, ...
- 第六章、Linux 的文件权限与目录配置
第六章.Linux 的文件权限与目录配置 1. 使用者与群组 2. Linux文件权限概念 2.1 Linux文件属性 2.2 如何改变文件属性与权限: chgrp, chown, chmod 2.3 ...
- linux pid文件
在Linux系统的目录/var/run下面一般我们都会看到很多的*.pid文件 作用 防止进程启动多个副本 有写入权限(F_WRLCK)的进程才能正常启动并把自身的PID写入该文件中 fcntl in ...
- linux 删除文件后 df 查看磁盘空间并没有释放
1.错误现象 Linux 磁盘空间总是报警,查到到大文件,删除之后,df看到磁盘空间并没有释放. 用du -sh ./* | sort -nr (查看当前目录下文件的大小)通过查找了下发现文件被mys ...
- (五)Linux之文件与目录管理以及文本处理
Linux之文件与目录管理 目录 Linux之文件与目录管理 前言 绝对路径与相对路径说明: 一.目录常用命令 常用处理目录的命令: 切换目录 cd 显示当前路径 pwd 查看目录下文件 ls 创建目 ...
随机推荐
- MyEclipse2014中项目名更改后如何使用新的项目名部署到Tomcat中去
在项目中调试的时候突然发现我复制的项目(项目名修改过了)部署在Tomcat中运行的时候还是显示的是原来的项目名,以至于我使用新的项目名称作为URL请求竟然是404,我去,当时感觉就不怎么好了. 当然, ...
- php中实现精确设置session过期时间的方法
http://www.jb51.net/article/52309.htm 大多数据情况下我们对于session过期时间使用的是默认设置的时间,而对于一些有特殊要求的情况下我们可以设置一下sessio ...
- 高吞吐高并发Java NIO服务的架构(NIO架构及应用之一)
高吞吐高并发Java NIO服务的架构(NIO架构及应用之一) http://maoyidao.iteye.com/blog/1149015 Java NIO成功的应用在了各种分布式.即时通信和中 ...
- 转载:在Visual Studio 2013中管理中国特色的社会主义Windows Azure
原文链接: http://www.pstips.net/get-azurechinacloud-settings.html 谷歌被豪迈地放弃了中国市场,微软仍旧在中国市场摸爬滚打,跪着挣钱.其中私人定 ...
- JavaScript高级程序设计(二):在HTML中使用JavaScript
一.使用<script>元素 1.<script>元素定义了6个属性: async:可选.表示应该立即下载脚本,但不应该妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本 ...
- OC - 1.面向过程和面向对象的思想对比
一.面向过程 1> 思想 面向过程是一种以过程为中心的最基础编程思想,不支持面向对象的特性. 面向过程是一种模块化程序设计方法 2> 开发方法 面向过程的开发方法是以过程(也可以说是模块) ...
- 近期专案PM相关收获
1, 厚黑学讲的有道理, 坏人? 为什么占便宜., 好人为什么当不了坏人是有一定道理的. -- 作为PM,能力大小居然都能胜任,从这一点上对组员不负责,如下种种都算有则改之无则加勉. ...
- Codevs 1172 Hankson 的趣味题 2009年NOIP全国联赛提高组
1172 Hankson 的趣味题 2009年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description Hanks 博 ...
- linux下用户以及用户组管理
/etc/passwd ‘/etc/passwd’ 由 ‘:’ 分割成7个字段,每个字段的具体含义是: 1)用户名.用户名字符可以是大小写字母.数字.减号(不能出现在首位).点以及下划线,其他字符不合 ...
- 更新ACCESS数据库出现“字段太小而不能接受所要添加的数据的数量。试着插入或粘贴较少的数据。”的解决方法
今天进行数据调试时出现“字段太小而不能接受所要添加的数据的数量.试着插入或粘贴较少的数据.”,跟踪发现是在更新数据库的数据时出现的. 打开数据库表格发现出错的数据字段类型被定义为“文本”,也就是数据最 ...