Posix fcntl记录上锁

记录上锁的Posix接口是fcntl函数

#include <fcntl.h>
int fcntl(int fd, int cmd, .../* struct flock *arg */);

成功时取决于cmd,出错时为-1

用于记录上锁的cmd参数共有三个值。这三个命令要求第三个参数arg是指向某个flock结构的指针:

struct flock

{

short l_type;/*F_RDLCK, F_WRLCK, F_UNLCK*/

short l_whence; /*SEEK_SET, SEEK_CUR, SEEK_END*/

off_t l_start;

off_t l_len;

pid_t l_pid;

};

1、F_SETLK: 获取(l_type成员为F_RDLCK或F_WRLCK)或释放(l_type成员为F_UNLCK)由arg指向的flock结构所描述的锁。如果该锁无法授予调用进程,该函数就立即返回一个EACCESS或EAGAIN错误而不阻塞

2、F_SETLKW:该命令与上一个命令类似,然而,如果所请求的锁无法授予调用进程,调用线程将阻塞到该锁能够授予为止。

3、F_GETLK:检查由arg指向的锁以确定是否有某个已存在的锁会妨碍新锁授予调用进程。如果当前没有这样的锁存在,由arg指向的flock结构的l_type成员就被置为F_UNLCK。否则,关于这个已存在锁的信息将在由arg指向的flock结构中返回,其中包括持有该锁的进程的进程ID。发出F_GETLK命令后紧接着发出F_SETLK命令不是一个原子操作。这就是说,如果我们发出F_GETLK命令,并且执行该命令的fcntl函数返回时置l_type成员为F_UNLCK,那么跟着立即发出F_SETLK命令不能保证其fcntl函数会成功返回。这两次调用 之间可能有另外一个进程运行并获取了我们想要的锁。

提供F_GETLK命令的原因在于:当执行F_SETLK命令的fcntl函数返回一个错误时,导致该错误的某个锁的信息可由F_GETLK命令返回,从而允许我们确定是哪个进程锁住了所请求的文件区,以及上锁方式(读出锁或写入锁)

l_len成员指定从该偏移开始的连续字节数。长度为0意思是从起始偏移到文件偏移的最大可能值。因此锁住整个文件表两种方式:
1、指定l_whence成员为SEEK_SET,l_start成员为0,l_len成员为0

2、使用lseek把读写指针定位到文件头,然后指定l_whence成员为SEEK_CUR,l_start成员为0,l_len成员为0

进程通信学习笔记(记录上锁)相关推荐

  1. linux一个进程通知另外一个进程,Linux进程通信学习笔记

    一.为什么需要进程通信 1)数据传输 一个进程需要把它的数据发送给另一个进程. 2)资源共享 多个进程之间共享同样的资源. 3)通知事件 一个进程向另外一个进程发送消息,通知它发生了某事件. 4)进程 ...

  2. 进程通信学习笔记(读写锁)

    读写锁的分配规则: 1.只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有读写锁用于读 2.仅当没有线程持有某个给定的读写锁用于读或用于写时,才能分配该读写锁用于写 这种对于某个给定资 ...

  3. 进程通信学习笔记(互斥锁和条件变量)

    1.互斥锁:上锁和解锁 Posix互斥锁作为数据类型pthread_mutex_t的变量声明.如果互斥锁变量是静态分配的,那么可以把它初始化成常值PTHREAD_MUTEX_INITIALIZER.如 ...

  4. 进程通信学习笔记(System V消息队列)

    跟Posix消息队列一样,不存在这样的要求:某个进程往一个队列中写入一个消息,另外一个进程下在等待该队列上一个消息的到达 系统中的消息队列,定义在<sys/msg.h>头文件中的信息结构: ...

  5. 进程通信学习笔记(Posix消息队列)

    在某个进程往一个队列写入消息之前,并不需要另外有个进程在该队列上等待消息的到达,这跟管道和FIFO是相反的,对于后两者来说,除非读出者已存在,否则先有写入者是没有意义的 1.mq_open.mq_cl ...

  6. 进程通信学习笔记(管道)

    1.管道 pipe函数创建单向数据流 #include <unistd.h> int pipe(int fd[2]); 成功返回0,失败返回-1 该函数返回两个文件描述字:fd[0]和fd ...

  7. Linux进程线程学习笔记:运行新程序

    Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下文并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一 ...

  8. Activiti 学习笔记记录(2016-8-31)

    上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件 转载于:https://ww ...

  9. STM32 CAN总线通信学习笔记(一)

    STM32 CAN总线通信学习笔记(一) 一.CAN总线简介 CAN 是控制器局域网络(Controller Area Network, CAN)的简称.CAN采用数据块编码的方式,数据块根据帧的类型 ...

最新文章

  1. php 重新载入类文件夹,php-如何配置Behat从应用程序特定文件夹自动加载类
  2. js高级---js运行原理
  3. python opencv图片旋转180度_Python opencv图像镜像翻转
  4. Git 忽略提交 .gitignore模板
  5. 【BZOJ-2325】道馆之战 树链剖分 + 线段树
  6. 开放下载!《大促背后的前端核心业务实践》
  7. 机器学习-LR推导及与SVM的区别
  8. Django之序列化
  9. 开源开放 | Beyond 预训练语言模型,NLP还需要什么样的知识?
  10. 创新!谷歌大改Transformer注意力
  11. Kali Linux 网络扫描秘籍 第七章 Web 应用扫描(一)
  12. arraylist线程安全吗_Java中的List你真的会用吗?不会用的话请收藏我的这篇文章...
  13. mysql 多条记录判断相加减进行计算
  14. 关于python中的字符串编码理解
  15. 2021厦门LED照明产业展览会
  16. 一个合格的全栈工程师应该具备哪些技能?
  17. 设置div背景颜色透明度,内部元素不透明
  18. siki学院的飞机大作战UE4.26代码
  19. 华为开发者大会:Open API时代来临
  20. 【基于贪心的树型动态规划】【NOI2007】追捕盗贼

热门文章

  1. linux m4a 转换成 mp3
  2. MySoft.Data入门篇:实体生成
  3. php开发app接口教学,php开发App接口
  4. python爬虫如何从一个页面进入另一个页面-Python爬虫如何获取页面内所有URL链接?本文详解...
  5. 哪里可以接到python的活干-越忙越穷?赶紧把瞎忙活的事情交给Python吧!
  6. python 仪表盘-python仪表盘
  7. python平均工资-2020 10大薪资最高的IT编程语言排名
  8. 学python需要什么基础知识-学Python需要什么基础知识?零基础可以学Python吗?
  9. python上海培训哪里比较好-上海python培训哪家好 Python需要多久学会
  10. 学python可以干嘛-学习Python可以做什么