博客搬家,原地址:https://langzi989.github.io/2018/01/06/Unix中fcntl实现对文件加锁功能/

之前有一篇文章详细介绍了fcntl的用法,这一节将说明使用fcntl实现对文件加锁的功能,

fcntl函数原型

fcntl函数如下,具体用法可参考上面的文章。

#include <fcntl.h>
int fcntl(int fd, int cmd, .../*int args or lock args*/);

使用fcntl对文件加锁

当fcntl中的cmd为F_GETLK,F_SETLK,F_SELFKW时为对文件进行锁操作,此时arg参数为flock。注意:使用fcntl对文件加锁,加锁效果类似于自旋锁,只有写写互斥和读写互斥,读读并不互斥。

cmd取值及其操作

  • F_GETLK : 获取当前锁得状态
  • F_SETLK : 给当前文件上锁(非阻塞)。
  • F_SETLKW : 给当前文件上锁(阻塞,若当前文件正在被锁住,该函数一直阻塞)。

flock结构体定义如下:

struct flock {short int l_type;short int l_whence;off_t l_start;off_t l_len;pid_t l_pid;
};

下面对flock中的参数一一解释:

  • l_type:此参数表示所得类型。其可能的取值包括一下三个:

    • F_RDLCK : 读锁
    • F_WRLCK : 写锁
    • F_UNLCK : 无锁状态
  • l_start : 此参数锁区域的开始位置的偏移量
  • l_whence:此参数决定锁开始的位置。其可选参数为:
    • SEEK_SET:当前位置为文件的开头
    • SEEK_CUR:当前位置为文件指针的位置
    • SEEK_END:当前位置为文件末尾
  • l_len : 锁定文件的长度

若要锁定整个文件,通常的方法为将l_start设为0,l_whence设为SEEK_SET,l_len设为0.

实例

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>void lock_set(int fd, int type) {struct flock lock;lock.l_whence = SEEK_SET;lock.l_start = 0;lock.l_len = 0;while (1) {lock.l_type = type;if ((fcntl(fd, F_SETLK, &lock)) == 0) {if (lock.l_type == F_RDLCK)printf("read lock set by %d\n", getpid());else if(lock.l_type == F_WRLCK)printf("write lock set by %d\n", getpid());else if (lock.l_type == F_UNLCK)printf("release lock by %d\n", getpid());return;}//检查文件是否可以上锁fcntl(fd, F_GETLK, &lock);//判断不能上锁的原因if (lock.l_type != F_UNLCK) {if (lock.l_type == F_RDLCK)printf("read lock has been already set by %d\n", getpid());else if (lock.l_type == F_WRLCK)printf("write lock has been already set by %d\n", getpid());getchar();}}
}
int main() {int fd;fd = open("data", O_RDWR | O_CREAT, 0666);if (fd < 0) {perror("open failed");return -1;}lock_set(fd, F_WRLCK);getchar();lock_set(fd, F_UNLCK);getchar();close(fd);return 0;
}

fcntl实现对文件加锁功能相关推荐

  1. python 加锁_python之给文件加锁(fcntl模块)

    对该文件加密:fcntl.flock(f,fcntl.LOCK_EX) 这样就对文件test加锁了,如果有其他进程对test文件加锁,则不能成功,会被阻塞,但不会退出程序. 解锁:fcntl.floc ...

  2. python怎么加锁_python使用fcntl模块实现程序加锁的方法

    python使用fcntl模块实现程序加锁功能示例 本文实例讲述了python使用fcntl模块实现程序加锁功能.分享给大家供大家参考,具体如下: python 中引入给文件加锁的 fcntl模块 i ...

  3. python 中给文件加锁——fcntl模块

    如果没有fcntl模块则用 sudo pip install fcntl安装 模块简单说明: 打开文件,不存在则创建之 f = open('./test','w') fcntl.flock(f,fcn ...

  4. python os 文件锁_python 中给文件加锁——fcntl模块

    如果没有fcntl模块则用 sudo pip install fcntl安装 模块简单说明: 打开文件,不存在则创建之 f = open('./test','w') fcntl.flock(f,fcn ...

  5. C Linux 文件加锁 lock fcntl

    Linux系统中,文件上锁的函数有两个Lock和fcntl ,前者主要是加建议性锁,后者既可以加建议性锁(默认)也可以加强制性锁,而且她还可以给某一记录进行上锁,即所谓的记录锁. fcntl文件锁有两 ...

  6. python文件加锁

    首先要引入库 import fcntl 打开一个文件 f = open('./test') 对该文件加密: fcntl.flock(f, fcntl.LOCK_EX) 这样就对文件test加锁了,如果 ...

  7. SVN ---文件加锁,执行clean up命令

    一.SVN 中 clean up 的功能 当Subversion改变你的工作拷贝(或是.svn中的任何信息),它会尽可能的小心,在修改任何事情之前,它把意图写到日志文件中去,然后执行log文件中的命令 ...

  8. gi克隆github文件_如何构建GitHub文件搜索功能的克隆

    gi克隆github文件 In this article, we will build a project that mimics the lesser known but awesome file ...

  9. 基于python的文件传输程序_7个步骤,教你快速学会用python实现ftp文件传输功能(收藏了)...

    文章主要为大家详细介绍了python实现ftp文件传输功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!!! 本文实例为大家分享了python实现ftp文件传输的具体 ...

  10. 如何为linux 桌面文件内存,linux - 桌面Linux发行版中.desktop文件的功能是什么? - 堆栈内存溢出...

    我有以下情况:我必须修改一个.desktop文件,该文件位于我正在使用的应用程序的包中. 当我尝试打开文件的内容时,我遇到了一个奇怪的问题. 如果我点击它然后我尝试点击"打开"它给 ...

最新文章

  1. mysql象限和投影_PostGIS空间数据库SRID背景知识 - 地理坐标系(球面坐标系)和投影坐标系(平面坐标系) - GIS开发者...
  2. 阿里巴巴在 Serverless 计算领域的探索
  3. DE1-LINUX运行
  4. StarUML 破解方法2.X(转)
  5. mysql查询去年本月的数据_MySQL查询本周、上周、本月、上个月份数据的sql代码...
  6. linux+listen错误,linux listen()
  7. Android闹钟程序周期循环提醒源码(AlarmManager)【转】
  8. 第三回 Bootstrap3.x 起步
  9. 41. Element getElementsByTagName() 方法
  10. 内核调试工具 — kdump crash
  11. 智力问答选择题_智力问答:智力题大全及答案
  12. .net反编译工具Reflector下载(转)
  13. flying saucer技术生成pdf文档
  14. 干货!假新闻检测:观察新闻本身,更要观察它所在的新闻环境
  15. 教程|Word/WPS永久更改默认背景颜色
  16. 十款ASP CMS建站系统源码
  17. word分栏排版时 插入全页宽的表格
  18. 计算机必须设置默认打印机,电脑系统怎么默认打印机 默认打印机的设置教程...
  19. 二分图匹配Hopcroft-Carp算法介绍
  20. AI Studio 精品项目 | 基于Few-shot Learning实现中文科学文献学科分类

热门文章

  1. SPSS26版本软件超详细安装指导+内附安装资源
  2. 手机chrome扫描二维码_90%的用户都不知道这项Chrome隐藏功能如何开启,超级实用!...
  3. dqmh框架 labview_LabVIEW宝典(第2版)简介,目录书摘
  4. Idea全部快捷键+自行修改快捷键
  5. 一个函数中写多少行代码比较合适呢?
  6. pdf论文在线翻译网站
  7. 每位程序员必读的书单
  8. 计算机程序设计在线课程,最新章节测试答案2020学堂在线计算机程序设计基础(先修课)...
  9. php 10环境一键安装包下载,php环境一键安装包
  10. 凯文米特尼克-《欺骗的艺术》[完整中文版][DOC][PDF]