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 创建目 ...
随机推荐
- Visual Basic|VB 6.0中文版
附加下载链接:http://xiazai.zol.com.cn/detail/3/29939.shtml?&437886-tsina-1-838-a507c04d8e448a55dd65bfc ...
- /etc/resolv.conf文件详解
大家好,今天51开源给大家介绍一个在配置文件,那就是/etc/resolv.conf.很多网友对此文件的用处不太了解.其实并不复杂,它是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名 ...
- 使windows server 2003 开机不显示登录页面
1.运行“regedit”,以打开“注册表管理器”:运行注册表编辑器,依次展开[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersi ...
- 如何在Angular2中使用Forms
在Angular2中形成两个基本对象是Control和ControlGroup. 控制用户输入 Control 一个控制表示一个输入字段(ngFormControl) 一个控制可以绑定到一个input ...
- Poj 2115 C Looooops(exgcd变式)
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22704 Accepted: 6251 Descripti ...
- VMProtect使用小计【一】
文章列表 VMProtect使用小计[一] – 初次使用VMProtect使用小计[二] – 加壳查看VMProtect使用小计[三] – 权限管理 说明 VMProtect的功能我就不说了,详情大家 ...
- Name control
static: (Page 406) In both C and C++ the keyword static has two basic meanings, which unfortunately ...
- HeadFirst设计模式
oo基础 抽象 封装 多态 继承 oo原则 封装变化 多用组合,少用继承 针对接口编程,不针对实现编程(策略模式) 为交互对象之间的松耦合设计而努力(观察者模式) 对扩展开放,对修改关闭(装饰者模式) ...
- html 头部正常用法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events
由于工作需要,决定深入研究SQL Server的扩展事件(Extended Events/xEvents),经过资料搜索,发现国外大牛的系列文章,作为“学习”阶段,我先翻译这系列文章,后续在工作中的心 ...