fcntl记录锁实例
fcntl 函数是一个相当常用的对文件进行加锁操作的函数。
文件锁包括强制锁、建议锁、记录锁, 不过一般系统和内核都是用的强制锁。
以下为记录锁的例子:-----------------------------------------------
记录锁分为读锁、写锁。。
读锁是共享锁,可以有多把,多个进程可以同时对一个文件读。
写锁是互斥锁,同一时间只能有一个进程写文件。
fcntl的函数原型:int fcntl(int fd, int cmd, struct flock *lock);
参数说明:fd是文件描述符;cmd 相当于命令符,F_SETLK和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(解锁);(也即0.1.2三个值);
l_whence也有三种取值:SEEK_SET(文件开头),SEEK_END(文件结尾),SEEK_CUR(当前位置);
l_len 是加锁区域的长度;
l_pid 是加锁进程的pid号;
技巧:为加锁整个文件,通常的方法是将l_start说明为0,l_whence说明为SEEK_SET,l_len说明为0。
================================================================================================================
set.cpp 为读锁时,在 get.cpp 调用fcntl获取读锁的信息是获取不到的,因为读锁可能有很多把,在get.cpp 中调用fcntl直接返回了F_UNLCK. 而写锁只有一把,所以在set.cpp 中设置写锁时,get.cpp中能正确返回写锁的信息。
set.cpp--------------------------------------------------------------------------------------------------------
实例:
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <iostream>
using namespace std;
int main()
{
struct flock flo;
memset(&flo, 0, sizeof(struct flock));
flo.l_type = F_WRLCK;
flo.l_whence = SEEK_SET;
flo.l_start = 0;
flo.l_len = 0;
int fd;
if(0 == (fd=open("/home/qinwg/qinwg/function/1.txt", O_RDWR)))
{
cout<<"can not open file,error!"<<endl;
}
if(-1 == fcntl(fd, F_SETLK, &flo))
{
cout<<strerror(errno)<<endl;
close(fd);
return 1;
}
while(1)
{}
//fcntl(fd, F_GETLK, &flo);
//if(flo.l_type == F_WRLCK)
// cout<<"yes"<<endl;
return 0;
}
get.cpp---------------------------------------------------------------------------------------------
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <iostream>
using namespace std;
int main()
{
struct flock flo;
memset(&flo, 0, sizeof(struct flock));
int fd;
if(0 == (fd=open("/home/qinwg/qinwg/function/1.txt", O_RDWR)))
{
cout<<"can not open file,error!"<<endl;
}
//struct flock test;
fcntl(fd, F_GETLK, &flo);
if(flo.l_type == F_WRLCK)
cout<<"WRLOCK"<<endl;
close(fd);
return 0;
}
注意:一定要在两个程序中测试F_GETLK命令,如果在一个程序里面,肯定会是解锁状态。。自己对自己是解锁状态的。。切记
fcntl记录锁实例的更多相关文章
- fcntl记录锁
#include<fcntl.h> int fcntl(fd,F_GETLK/F_SETLK/F_SETLKW,struct flock *flockptr); F_GETLK:测试flo ...
- 高级I/O之记录锁
若两个人同时编辑一个文件,其后果将如何呢?在很多UNIX系统中,该文件的最后状态取决于写该文件的最后一个进程.但是对于有些应用程序(例如数据库),进程有时需要确保它正在单独写一个文件.为了向进程提供这 ...
- Linux-进程间通信(六): 记录锁
1. 记录锁:记录锁的功能是,当一个进程正在读或者修改文件的某个部分的时候,它可以阻止其他进程修改同一文件区: 2. fcntl记录锁: #include <fcntl.h> int fc ...
- Linux进程同步之记录锁(fcntl)
记录锁相当于线程同步中读写锁的一种扩展类型,可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步,通过fcntl函数来执行上锁操作.尽管读写锁也可以通过在共享内存区来进行进程的同步,但是fcntl记 ...
- 非阻塞io与记录锁
非阻塞io 1.对比 阻塞io的例子:scanf从终端获取输入时,如果不输入程序就会一直停在那; 对一个已经有写锁的文件请求读时, 会一直空等直到前面的进程释放锁... 非阻塞的例子:读取文件内容, ...
- [11]APUE:(文件)记录锁
[a] 概念 建议锁:在遵循相同记录锁规则的进程间生效,通常用于保证某个程序自身多个进程间的数据一致性 强制锁:意在保证所有进程间的数据一致性,但不一定有效:如不能应对先 unlink 后建立同名副本 ...
- linux c编程:记录锁
记录锁相当于线程同步中读写锁的一种扩展类型,可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步,通过fcntl函数来执行上锁操作.尽管读写锁也可以通过在共享内存区来进行进程的同步,但是fcntl记 ...
- inux c编程:记录锁
记录锁的功能:当一个进程正在读或修改文件的某个部分是,它可以阻止其他进程修改同一文件区.对于这个功能阐述我认为有三点要解释的: 记录锁不仅仅可以用来同步不同进程对同一文件的操作,还可以通过对同一文件加 ...
- linux 文件记录锁详解
一: linux记录锁更恰当的称呼应该是范围锁,它是对文件某个范围的锁定. 关于记录锁的功能就是fcntl提供的第五个功能,具体使用如下: int fcntl(int fd, int cmd, str ...
随机推荐
- tableView -- tips
1. 如果发现TableView的第一个sectionHeader不显示, 那么可以断定, 你没有用代理方法来设置 sectionHeader的高度! #pragma mark - delegate ...
- java单例模式使用及注意事项
1. 说明 1)单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例 2)单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstan ...
- JAVA入门第一季(mooc-笔记)
笔记相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第一季 ...
- Python的字符串操作和Unicode
字符串类型 str:Unicode字符串.采用''或者r''构造的字符串均为str,单引号可以用双引号或者三引号来代替.无论用哪种方式进行制定,在Python内部存储时没有区别. bytes:二进制字 ...
- delphi xe5 android 关于文件大小的几个问答O(∩_∩)O~
摘自:http://blogs.embarcadero.com/vsevolodleonov/2013/09/19/are-you-asking-about-app-size-by-delphi-fo ...
- 总结: Struts2 + Spring 的线程安全问题
1. 首先Struts2 本身是安全的 其原理大概是:Strtus2会获取到用户的http请求,然后负责给每个请求实例化一个Action 对象,但是大家注意,这里的action对象和Struts1里面 ...
- LINUX关闭防火墙(转载)
(1) 重启后永久性生效: 开启:chkconfig iptables on 关闭:chkconfig iptables off (2) 即时生效,重启后失效: 开启:service iptables ...
- Android 带着用户名的SharedPreferences
/** * 设置当前用户的签到信息 * account&info;account&info * * @param context * @param sign * @author jrj ...
- Android ImageButton | Button | TextView 点击和触摸效果
ImageButton------------------------------------------------> 一.Java 代码: 在drawable目录下添加新的xml文件 bu ...
- 【Quick 3.3】资源脚本加密及热更新(一)脚本加密
[Quick 3.3]资源脚本加密及热更新(一)脚本加密 注:本文基于Quick-cocos2dx-3.3版本编写 一.脚本加密 quick框架已经封装好加密模块,与加密有关的文件在引擎目录/quic ...