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 创建目 ...
 
随机推荐
- mybatis错误:Invalid bound statement (not found)
			
解决办法是去看看mybatis配置里面的可能因为配置为什么格式文件解析不到 <property name="mapperLocations" value="clas ...
 - 一个fibonacci数列简单求和的问题
			
前段时间老师在讲函数调用的时候,用Fibonacci数列来演示了一下,因为以前没怎么接触过Fibonacci,所以当时很懵. 当时让求的是Fibonacci数列中,第N位值为多少,当时老师写的是: 之 ...
 - 巧谈 GCD
			
转载自:http://www.jianshu.com/p/665261814e24 谈到iOS多线程,一般都会谈到四种方式:pthread.NSThread.GCD和NSOperation.其中,苹果 ...
 - 类库探源——System.Drawing.Bitmap
			
一.System.Drawing.Bitmap Bitmap 类: 封装GDI+ 位图,此位图由图形图像及其属性的像素数据组成.Bitmap 是用于处理由像素定义的图像的对象 命名空间: System ...
 - redis基本数据类型【1】-String类型
			
1.赋值与取值 set key value get key 2.设置自增 #自增1 incr num #指定增长跨度 incrby num 10 设置自减 #自增1 decr num #指定增长跨度 ...
 - javaee学习-Cookie使用范例
			
Java中的javax.servlet.http.Cookie类用于创建一个Cookie Cookie类的主要方法 No. 方法 类型 描述 1 Cookie(String name, String ...
 - SGU 解题报告
			
Volume 1 Volume 2
 - Essential C++ 学习笔记01--基本语法
			
<Essential C++>1.1-1.4节笔记 1. main 函数 main 函数是代码的入口,若无 main 函数,编译不通过. main 函数通常声明为 int, return ...
 - think ajax 应用
			
首先得引入 jquery 文件,另外定义一个处理的 js.js 文件 如实现用 post 传输方法: 模板文件: <script type="text/javascript" ...
 - 已经安装php后,再增加扩展模块(不重新编辑php)
			
下面以安装curl为例,介绍具体安装步骤. 1.安装crul wget http://curl.haxx.se/download/curl-7.19.6.tar.gz tar -zxvf curl-7 ...