一:flock函数特点:
1.flock只能加全局锁。
2.当一个进程用flock给一个文件加锁时,用另一个进程再给这个文件加锁,它会阻塞或者也可以返回加锁失败(可以自己设置)。
3.当给一个文件加fcntl的独占锁后,再给这个文件加flock的独占锁,其会进入阻塞状态。
4.当给一个文件加flock的独占锁后,用fcntl去获取这个锁信息获取不到,再用fcntl仍然可以给文件加锁。
5.用flock之前需要用户自己去检查一下是否已经上了锁,在进行操作,否则直接写入文件,锁为不起作用。
二:遇到的问题:
一个进程去打开文件,输入一个整数,然后上一把写锁(LOCK_EX),再输入一个整数将解锁(LOCK_UN),
另一个进程打开同样一个文件,直接向文件中写数据,发现锁不起作用,能正常写入(我此时用的是超级用户)。
解决问题,发现flock不提供锁检查,也就是说在用flock之前需要用户自己去检查一下是否已经上了锁,
说明白点就是读写文件之前用一下flock检查一下文件有没有上锁,如果上锁了flock将会阻塞在那里
(An attempt to lock the file using one of these file descriptors may be denied by a lock
that the calling process has already placed via another descriptor ).
三:函数详解
表头文件 #include<sys/file.h>
定义函数 int flock(int fd,int operation);
函数说明 flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。
参数 operation有下列四种情况:
LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。
LOCK_UN 解除文件锁定状态。
LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。
单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。
返回值 返回0表示成功,若有错误则返回-1,错误代码存于errno。
flock只要在打开文件后,需要对文件读写之前flock一下就可以了,用完之后再flock一下,前面加锁,后面解锁。
四:代码

file1.c

#include <sys/file.h>
#include <stdio.h>int main (void)
{FILE *fp = NULL;int i = 20;if ((fp = fopen("./file_lock.test", "r+b")) == NULL) //打开文件printf("file open error!\n");if (flock(fp->_fileno, LOCK_EX) != 0) //给该文件加锁printf("file lock by others\n");while(1) //进入循环,加锁时间为20秒,打印倒计时{printf("%d\n", i--);sleep(1);if (i == 0)break;}fclose(fp); //20秒后退出,关闭文件flock(fp->_fileno, LOCK_UN); //文件解锁return 0;}

file2.c

#include <sys/file.h>
#include <stdio.h>
int main(void){FILE *fp = NULL;int i = 0;if ((fp = fopen("./file_lock.test", "r+b")) == NULL) //打开文件printf("file open error!\n");flock(fp->_fileno, LOCK_EX); //文件加锁while(1) //进入循环{printf("%d\n", i++);sleep(1);}fclose(fp); //关闭文件flock(fp->_fileno, LOCK_UN); //释放文件锁return 0;}
首先运行file1.c,紧接着运行file2.c(运行file1.c后20秒内要运行file2.c否则看不到现象)

现象是:file1.c执行起来以后,开始倒计时。此时运行file2.c会阻塞在加锁处。当file1.c运行20秒后关闭文件,并释放文件锁后,file2.c会开始运行。



linux C语言实现文件锁之flock相关推荐

  1. 每天进步一点点——Linux文件锁编程flock

    转载请注明出处:http://blog.csdn.net/cywosp/article/details/30083015 1. 场景概述     在多线程开发中.相互排斥锁能够用于对临界资源的保护,防 ...

  2. Linux文件锁学习-flock, lockf, fcntl

    参考  linux中fcntl().lockf.flock的区别 这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是f ...

  3. linux c语言文件锁,Linux下glibc库文件锁:协同锁(advisory lock)和强制锁(mandatory lock)...

    Linux系统上的文件锁主要分为协同锁(advisory lock)和强制锁(mandatory lock).在Linux上使用的文件锁大部分为协同锁,而且使用强制锁的时候也要检查系统是否支持强制锁. ...

  4. Golang入门之——文件锁操作flock

    有时候,我们使用go语言开发一些程序的时候,往往出现多个进程同时操作同一份文件的情况,这很容易导致文件中的数据混乱. 我们需要采用一些手段来平衡这些冲突:需要锁操作来保证数据的完整性,这里介绍的针对文 ...

  5. 在 Ubuntu 上通过命令行改变 Linux 系统语言

    这是一个快速教程,展示了在 Ubuntu 和其他 Linux 发行版上从命令行改变语言的步骤. 事实上,我一直在写西班牙语的文章.如果你没有访问过它并且/或你是一个讲西班牙语的人,请访问 It's F ...

  6. Linux C语言调用C++动态链接库

    Linux C语言调用C++动态链接库 标签: C调用C++库 2014-03-10 22:56 3744人阅读 评论(0) 收藏 举报 分类: [Linux应用开发](48) 版权声明:本文为博主原 ...

  7. linux C语言多线程库pthread中条件变量的正确用法逐步详解

    linux C语言多线程库pthread中条件变量的正确用法: 了解pthread常用多线程API和pthread互斥锁,但是对条件变量完全不知道或者不完全了解的人群. 关于条件变量的典型应用,可以参 ...

  8. linux C 语言的 system

    linux C 语言的 system是用来在程序中执行shell命令. 使用方法 #include<stdlib.h> //函数形式 int system(const char * str ...

  9. 嵌入式linux寄存器位运算,嵌入式linux C语言(一)――位运算的使用

    嵌入式linux C语言(一)――位运算的使用 ARM是内存与IO统一编址,SoC中有很多控制寄存器,通过对这些寄存器进行位运算对这些控制寄存器进行设置,进而控制外设功能.在修改寄存器某些位的过程中不 ...

最新文章

  1. golomb哥伦布编码——本质上就是通过0来区分商和余数
  2. IDC时评:你对边缘计算有多少误解?
  3. asp.net基础中Get和Post的区别。
  4. 网易云信 — 陪你打怪让你飞!
  5. “泡沫”之后,强化学习已应用到这些领域
  6. CRMEBv3.0版本更新了什么?
  7. java i o中文版_Java文件I/O的三种方法
  8. 开发大会上,前微软CEO放出的狠话!.NET开发随时起飞,你准备好了吗?
  9. cuSPARSE库:(十七)cusparseStatus_t 返回信息
  10. ca 自建 颁发证书_自建 ca 及使用 ca 颁发证书
  11. 编辑画面,element-ui的单选框组选中值以及画面选择样式无法切换,但是绑定的v-model值已发生变化
  12. 学生选课系统 c语言
  13. linker command failed with exit code 1
  14. 【Verilog 常见设计】(0)二进制码和格雷码互转 Verilog 实现
  15. java中solr的面试题_面试:----利用solr实现商品的搜索功能
  16. Laravel Eloquent 数据查询结果中日期的格式化
  17. html+css基础教程之html简介和元素
  18. 【渝粤教育】广东开放大学 动画运动规律 形成性考核 (25)
  19. powerbi服务器无法显示报表,Power BI 报表中的页面显示设置 - Power BI | Microsoft Docs...
  20. js如何获取滚动条的高度

热门文章

  1. python分析qq聊天记录汉字频率
  2. nx二次开发之齿轮快速建模
  3. CSRF(跨站请求伪造)漏洞
  4. 生产者与消费者问题?
  5. 群晖webdev挂载中国移动和彩云网盘
  6. 了解CNN这一篇就够了——关于卷积神经网络的介绍
  7. 群晖室开虚拟机安装于服务器,如何在虚拟机上安装黑群晖?
  8. Sting str = aaaa 的形式定义一个字符串最大长度只能有 65534 个。
  9. jquery ui放大缩小_jQuery UI 实例
  10. Node.js 中的 Buffer 和字符编码