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 创建目 ...
随机推荐
- Java 链式编程
这里来做一个Java 链式编程的例子,基本就是每次返回一个对象本身,这样就能够去调用对象的方法和属性. package com.sun; public class Demo05 { /** * @pa ...
- Linq常用查询运算符
Linq一共包含五十几个查询运算符,常用的根据类型来区分一共有5类左右,这五类里面一些事在项目查询中经常用到的.不过linq运算符的命名十分规范,基本从字面意思就能猜测出来是干嘛用的,下面我们挑选一些 ...
- Tomcat中JSP引擎工作原理
http://blog.csdn.net/linjiaxingqqqq/article/details/7164449 JSP运行环境: 执行JSP代码需要在服务器上安装JSP引擎,比较常见的引擎有W ...
- Linux搭建SSH服务器
Linux 远程登录服务:ssh ·SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Te ...
- iOS开发——友盟分享
==========2016-01-29 更新=====刘成利 email:liu_cheng_li@qq.com========== 自己成功集成到公司的项目前,也已做了测试好的友盟分享demo 目 ...
- Codevs 1427 特种部队(双路DP)
1427 特种部队 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 黄金 Gold 题目描述 Description 某特种部队接到一个任务,需要潜入一个仓库.该部队士兵分为两路,第一 ...
- ObjectQuery查询及方法
ObjectQuery 类支持对 实体数据模型 (EDM) 执行 LINQ to Entities 和 Entity SQL 查询.ObjectQuery 还实现了一组查询生成器方法,这些方法可用于按 ...
- nginx 502
查过网上的资源,基本都是认为是php线程打开文件句柄受限导致的错误.具体的解决的办法如下: 1.提升服务器的文件句柄打开打开 /etc/security/limits.conf : (增加) * ...
- js微博发布框
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 网站开发常用jQuery插件总结(12)固定元素插件scrolltofixed
这个插件在前段时间用过一次,当时是改一个网站.要求顶部的菜单栏随着滚动条的滚动而固定.也大体写了一下,不过在文章中也只是提了一下,文章地址:jQuery插件固定元素位置. 在这篇文章中,再进行总结一下 ...