文件锁-文件共享

  • 共享资源竞争问题的解决方法:文件锁。
  • 文件锁包括
    • 建议性锁 要求每个上锁文件的进程都要检查是否有锁存在,并且尊重 已有的锁
    • 强制性锁 由内核执行的锁,当一个文件被上锁进行写入操作的时候, 内核将阻止其他任何文件对其进行读写操作。
  • 文件上锁的函数
    • lockf()
      用于对文件施加建议性锁
    • fcntl()
      不仅可以施加建议性锁,还可以施加强制锁。同时还能对文 件的某一记录上锁,也就是记录锁。
  • 记录锁可分为
    • 读取锁: 又称为共享锁,能够使多个进程都能在文件的同一部分建立 读取锁。
    • 写入锁: 又称为排斥锁,在任何时刻只能有一个进程在文件的某个部 分上建立写入锁。
  • 注:在文件的同一部分不能同时建立读取锁和写入锁。

fcntl()函数格式

fcntl函数原型:

int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd ,struct flock* lock);

flock结构

struct flock
{short l_type;      /*锁的类型*/  off_t l_start;        /*偏移量的起始位置:SEEK_SET,SEEK_CUR,SEEK_END*/  short l_whence;     /*加锁的起始偏移*/  off_t l_len;       /*上锁字节*/  pid_t l_pid;      /*锁的属主进程ID */
}
  • flock结构变量取值

  • 上手代码:

1. lock_set.c实现文件记录锁功能:
/* lock_set.c */
int lock_set(int fd, int type)
{struct flock old_lock, lock;lock.l_whence = SEEK_SET;lock.l_start = 0;lock.l_len = 0;lock.l_type = type;lock.l_pid = -1;/* 判断文件是否可以上锁 */fcntl(fd, F_GETLK, &lock);//文件已有锁if (lock.l_type != F_UNLCK){/* 判断文件不能上锁的原因 */if (lock.l_type == F_RDLCK) /* 该文件已有读取锁 */{printf("Read lock already set by %d\n", lock.l_pid);}else if (lock.l_type == F_WRLCK) /* 该文件已有写入锁 */{printf("Write lock already set by %d\n", lock.l_pid);}         }/* l_type 可能已被F_GETLK修改过 */lock.l_type = type;/* 根据不同的type值进行阻塞式上锁或解锁 */if ((fcntl(fd, F_SETLKW, &lock)) < 0){printf("Lock failed:type = %d\n", lock.l_type);return 1;}switch(lock.l_type){case F_RDLCK:{printf("Read lock set by %d\n", getpid());}break;case F_WRLCK:{printf("Write lock set by %d\n", getpid());}break;case F_UNLCK:{printf("Release lock by %d\n", getpid());return 1;}break;default:break;}/* end of switch  */return 0;
}
2. 文件写入锁的测试用例 write_lock.c:

创建一个hello文件,之后对其上写入锁,键盘输入任意一个字符后解除写入锁。

/* write_lock.c */
#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include "lock_set.c"int main(void)
{int fd;/* 首先打开文件 */fd = open("hello",O_RDWR | O_CREAT, 0644);if(fd < 0){printf("Open file error\n");exit(1);}/* 给文件上写入锁 *///调用lock_set函数lock_set(fd,F_WRLCK);getchar();    //输入任意字符/* 给文件解锁 */lock_set(fd,F_UNLCK);getchar();  //close(fd);    exit(0);
}

补充笔记:关于Linux权限
Linux 系统中采用三位十进制数表示权限,如0755, 0644.
ABCD
A- 0, 表示十进制
B-用户
C-组用户
D-其他用户---  -> 0   (no excute , no write ,no read)
--x  -> 1   excute, (no write, no read)
-w-  -> 2   write
-wx  -> 3   write, excute
r--  -> 4   read
r-x  -> 5   read, excute
rw-  -> 6   read, write ,
rwx  -> 7   read, write , excute0755->即用户具有读/写/执行权限,组用户和其它用户具有读写权限;
0644->即用户具有读写权限,组用户和其它用户具有只读权限;
3. 在两个终端上运行./write_lock,查看运行结果

4. 编写文件读取锁的测试用例read_lock.c:创建一个hello文件,之后对其上读取锁,键盘输入任意一个字符后解除读取锁。
/* read_lock.c */
#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include "lock_set.c"
int main(void)
{int fd;fd = open("hello",O_RDWR | O_CREAT, 0644);if(fd < 0){printf("Open file error\n");exit(1);}/* 给文件上读取锁 */lock_set(fd,F_RDLCK);getchar();  //输入任意字符/* 给文件解锁 */lock_set(fd,F_UNLCK);getchar();  //输入任意字符close(fd);exit(0);
}

实现效果:

5. 在两个终端上运行./read_lock,查看运行结果。

6. 验证: 如果在一个终端上运行读取锁程序,在另一个终端上运行写入锁程序,会有什么结果?


嵌入式Linux基础学习笔记-文件IO编程-文件锁(1)相关推荐

  1. 嵌入式Linux基础学习笔记-文件IO编程-文件锁(2)

    文件操作仿真FIFO,实现生产者-消费者运行模型 编程实现生产者程序producer.c,创建仿真FIFO结构文件(普通文件),按照给定的时间间隔向FIFO文件写入自动生成的字符(自定义),生产周期及 ...

  2. 嵌入式Linux基础学习笔记-文件IO编程-I/O多路复用

    实验内容:多路复用-I/O操作及阻塞 编程实现文件描述符集合的监听 multiplex_poll.c文件编写: /* multiplex_poll.c */ #include <fcntl.h& ...

  3. 鸟哥私房菜linux基础学习笔记 1

    linux基础学习笔记 计算机:辅劣人脑的好工具 1.计算机硬件癿五大单元 输入单元:包括键盘.鼠标.卡片阅读机.手写板.触控屏幕等等一堆: 主机部分:这个就是系统单元,被主机机壳保护住了,里面有 C ...

  4. Python学习笔记:IO编程StringIO和BytesIO

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. Python学习笔记:Io编程序列化

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  6. IMX6ULL嵌入式Linux驱动学习笔记(二)

    IMX6ULL嵌入式Linux驱动学习 一.字符设备驱动 二.驱动模块的加载与卸载 三.字符设备的注册与注销 四.设备号 五.file_operations的具体实现 六.字符设备驱动框架 七.编写应 ...

  7. Linux基本命令学习笔记--文件查看、下载、查找

    1.Linux基本命令学习笔记–(文件查看) cat -整个查看 -n:行号 >(创建.覆盖) >>(追加)a.txt<<EOF:编写内容 内容 EOF (定格写:结束) ...

  8. Linux学习笔记——文件IO

    文章目录 前言 C语言操作文件的函数 系统接口 文件描述符 文件系统 动态库和静态库 前言   在系统角度理解文件:文件=内容+属性,内容和属性都是数据,对于文件的所有操作无外乎对于文件内容操作和对于 ...

  9. Linux基础学习笔记-第五课:文件权限

    Linux Linux下一切皆文件,每个文件权限都有属主.属组.其他三个身份,每个身份都有read.write.excute设定 账号配置文件:/etc/passwd 密码配置文件:/etc/shad ...

最新文章

  1. python中怎么输出中文-python中使用print输出中文的方法
  2. 10进制转化为16进制以内的转化
  3. linux搭建mysql主从模式_Linux下搭建MySQL的主从复制(一)
  4. JavaScript之eval() 函数
  5. TCP/IP:TCP SYN Flood攻击原理与实现
  6. qbittorrent container 改共享文件_SSH连接docker中的container
  7. Excel2013的PowerView报表
  8. vue-router parmas与query的区别
  9. StringBuffer 的 各种方法
  10. 课后作业3:软件与用户体验调查与分析
  11. mysql 交互式和非交互式操作(interactive_timeout和wait_timeout)
  12. 批量 材质 调整_3dmax怎么批量修改材质
  13. windows10如何使用Wallpaper Engine实现动态锁屏壁纸?把WE的壁纸应用到锁屏。
  14. ubuntu下安装小企鹅输入法
  15. sqlserver 包含关系
  16. ABP Vnext 扩展微信小程序授权登录
  17. three - 3 - 基础知识(1. three渲染结构,2.对canvas 进行响应式布局,3.让canvas 画布自适应设备分辨率 )
  18. eNSP 路由器配置-静态路由和缺省路由
  19. 新 Nano(五)自己写个库,读 DHT11 / DHT22
  20. 摆脱恐惧(老俞演讲稿)

热门文章

  1. [Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available
  2. PHP-代码审计-SQL注入
  3. tqdm: ‘module‘ object is not callable
  4. 关于 scrapy 框架必须掌握的核心知识
  5. 13.1.2 WEB应用程序
  6. 百练2757:最长上升子序列
  7. 存储类型_malloc_typedef小结
  8. 【Qt】undefined reference to `vtable for xxx’
  9. 【Qt】2D绘图之绘制图片
  10. 【STM32】中断相关函数和类型