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记录锁实例的更多相关文章

  1. fcntl记录锁

    #include<fcntl.h> int fcntl(fd,F_GETLK/F_SETLK/F_SETLKW,struct flock *flockptr); F_GETLK:测试flo ...

  2. 高级I/O之记录锁

    若两个人同时编辑一个文件,其后果将如何呢?在很多UNIX系统中,该文件的最后状态取决于写该文件的最后一个进程.但是对于有些应用程序(例如数据库),进程有时需要确保它正在单独写一个文件.为了向进程提供这 ...

  3. Linux-进程间通信(六): 记录锁

    1. 记录锁:记录锁的功能是,当一个进程正在读或者修改文件的某个部分的时候,它可以阻止其他进程修改同一文件区: 2. fcntl记录锁: #include <fcntl.h> int fc ...

  4. Linux进程同步之记录锁(fcntl)

    记录锁相当于线程同步中读写锁的一种扩展类型,可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步,通过fcntl函数来执行上锁操作.尽管读写锁也可以通过在共享内存区来进行进程的同步,但是fcntl记 ...

  5. 非阻塞io与记录锁

    非阻塞io 1.对比 阻塞io的例子:scanf从终端获取输入时,如果不输入程序就会一直停在那; 对一个已经有写锁的文件请求读时, 会一直空等直到前面的进程释放锁... 非阻塞的例子:读取文件内容, ...

  6. [11]APUE:(文件)记录锁

    [a] 概念 建议锁:在遵循相同记录锁规则的进程间生效,通常用于保证某个程序自身多个进程间的数据一致性 强制锁:意在保证所有进程间的数据一致性,但不一定有效:如不能应对先 unlink 后建立同名副本 ...

  7. linux c编程:记录锁

    记录锁相当于线程同步中读写锁的一种扩展类型,可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步,通过fcntl函数来执行上锁操作.尽管读写锁也可以通过在共享内存区来进行进程的同步,但是fcntl记 ...

  8. inux c编程:记录锁

    记录锁的功能:当一个进程正在读或修改文件的某个部分是,它可以阻止其他进程修改同一文件区.对于这个功能阐述我认为有三点要解释的: 记录锁不仅仅可以用来同步不同进程对同一文件的操作,还可以通过对同一文件加 ...

  9. linux 文件记录锁详解

    一: linux记录锁更恰当的称呼应该是范围锁,它是对文件某个范围的锁定. 关于记录锁的功能就是fcntl提供的第五个功能,具体使用如下: int fcntl(int fd, int cmd, str ...

随机推荐

  1. Hadoop新版本中map任务待处理split大小的计算方法

    1. split大小的计算公式 minSize=max{minSplitSize,mapred.min.split.size} (minSplitSize大小默认为1B) maxSize=mapred ...

  2. 剖析 Linux hypervisor--KVM 和 Lguest 简介

    慢慢弄清楚..   M. Tim Jones, 顾问工程师, Emulex Corp. M. Tim Jones 是一名嵌入式软件工程师,他是 Artificial Intelligence: A S ...

  3. eclipse查看.project .class隐藏文件

    fileter ->*.resource勾选:

  4. 如何设置EditPlus的默认编码utf-8方式

    最近在使用英文版的Editplus写代码的时候,发现中文字符在调试过程中都变成了乱码,发现是Editplus编码设置的问题,Editplus默认编码可能是ANSI,需要将其改成UTF-8.干脆给设置默 ...

  5. 在ubuntu下关闭笔记本触摸板

    http://www.cnblogs.com/icejoywoo/archive/2011/04/14/2016318.html 原文地址:http://forum.ubuntu.org.cn/vie ...

  6. mysql导出数据库几种方法

    方法一 cmd 到mysql bin目录下用 如下命令 mysqldump --opt -h192.168.0.156 -uusername -ppassword --skip-lock-tables ...

  7. Emmet(前身是zen coding)介绍和使用

    Zen coding - 一种快速编写HTML/CSS代码的方法.它使用仿CSS选择器的语法来快速开发HTML和CSS - 由Sergey Chikuyonok开发. 现在它改名为了Emmet,并且搭 ...

  8. 【HDOJ】1297 Children’s Queue

    递推,最近发现自己做递推的题总是没有思路.下周多练习.对于f(n)可以在第n个位置为男生,此时共有f(n-1)种情况:若在第n个位置为女生,因此第n-1个位置也必须为女生.此时有两种情况,一种情况是在 ...

  9. 《C#并行编程高级教程》第4章 并发集合 笔记

    这一章主要介绍了System.Collections.Concurrent下的几个类. ConcurrentQueue<T> 并发队列.完全无锁,使用CAS(compare-and-swa ...

  10. 原生APP与移动Web App的比较

    中国手机网民已超4.5亿,智能机用户超过3.8亿,中国移动互联网市场产值已超过712.5亿元,手机营销是未来必然趋势,而App恰恰是这个趋势下的一个强有力的营销工具: App已有两个主要的方向:原生A ...