多个进程同时操作一个文件

1. flock

int flock(int fd, int operation);

LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定(读锁定)

LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定

LOCK_UN 解除文件锁定状态

LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合

2. fcntl

int fcntl(int fd, int cmd, ... /* arg */ );
struct flock {
...
short l_type; /* Type of lock: F_RDLCK,
F_WRLCK, F_UNLCK */
short l_whence; /* How to interpret l_start:
SEEK_SET, SEEK_CUR, SEEK_END */
off_t l_start; /* Starting offset for lock */
off_t l_len; /* Number of bytes to lock */
pid_t l_pid; /* PID of process blocking our lock
(F_GETLK only) 持有锁 */
...
};
//lock set
struct flock lock = {0};
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 10; ret = fcntl(fd, F_SETLK, &lock);
ret = fcntl(fd, F_SETLKW, &lock); //阻塞模式
//lock get
if((ret = fcntl(fd, F_GETLK, &lock)) == 0)
{
switch(lock.l_type)
{
case F_UNLCK:
puts("F_UNLCK.");
break;
case F_RDLCK:
puts("F_RDLCK.");
break;
case F_WRLCK:
printf("l_start = %d\n", (int)lock.l_start);
printf("l_len = %d\n", (int)lock.l_len);
printf("l_pid = %d\n", (int)lock.l_pid);
puts("F_WRLCK.");
break;
}
}

各种锁将在相应的文件描述符被关闭时自动清除

死锁现象

两个程序同一时间对字节1和字节2进行修改。程序A选择先修改字节2,再修改字节1,而程序B先修改字节1,再修改字节2

两个程序应该以同样的顺序对他们准备修改的字节施行封锁,或者对一个更大的文件区域实施封锁

3. O_APPEND

不加锁也可以,但需要O_APPEND选项

文件锁 flock/fcntl的更多相关文章

  1. php原子操作,文件锁flock,数据库事务

    php原子操作,文件锁flock,数据库事务 php没有继承posix标准支持的unix锁,只封装了一个linux系统调用flock(信号量也能做成锁),按理也是可以使用锁机制的,虽然效率低一点.ph ...

  2. linux文件锁flock【转】

    转自: https://www.cnblogs.com/kex1n/p/7100107.html linux文件锁flock   在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要 ...

  3. Linux 文件锁flock 实现两个进程相互监听存活状态

    表头文件  #include<sys/file.h> 定义函数  int flock(int fd,int operation); 函数说明  flock()会依参数operation所指 ...

  4. Linux文件锁flock

    Linux文件锁flock 在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock. flock,建议性锁 ...

  5. Linux文件锁flock ,检测进程是否已经存在

    在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock.  头文件:#include<sys/fil ...

  6. linux 文件锁flock,lockf,fcntl

    1.flock,lockf,fcntl之间区别 先上结论:flock是文件锁,锁的粒度是整个文件,就是说如果一个进程对一个文件加了LOCK_EX类型的锁,别的进程是不能对这个文件加锁的. lockf是 ...

  7. python中进程间通讯——文件锁之fcntl模块的使用

    python 中给文件加锁——fcntl模块import fcntl 打开一个文件##当前目录下test文件要先存在,如果不存在会报错.或者以写的方式打开f = open('./test')对该文件加 ...

  8. php 文件锁flock解决并发

    方案一:使用文件锁排它锁 flock函数用于获取文件的锁,这个锁同时只能被一个线程获取到,其它没有获取到锁的线程要么阻塞,要么获取失败 在获取到锁的时候,先查询,如果查询成功则进行操作,然后释放锁 f ...

  9. Linux 2.6 中的文件锁

    简介: 本文的目的是想帮助读者理清 Linux 2.6中文件锁的概念以及 Linux 2.6 都提供了何种数据结构以及关键的系统调用来实现文件锁,从而可以帮助读者更好地使用文件锁来解决多个进程读取同一 ...

随机推荐

  1. spring-data-redis数据类型

    一.引入依赖 <!-- 缓存 --> <dependency> <groupId>redis.clients</groupId> <artifac ...

  2. 零基础学Python-第二章 :Python基础语法-04.Python程序的书写规则

    #号后面的都是注释 import是导入一个模块 结束

  3. windows10 环境下的amqp安装步骤(图文)

    安装PHP扩展ampq 查看phpinfo()信息 下载ampq扩展 下载地址:http://pecl.php.net/package/amqp 选择一个dll版本下载,本文选择的是1.9.3 自己根 ...

  4. ubuntu18.04安装golang

    首先我们通过如下命令安装golang: sudo add-apt-repository ppa:longsleep/golang-backports sudo apt-get update sudo ...

  5. 【Leetcode_easy】908. Smallest Range I

    problem 908. Smallest Range I solution: class Solution { public: int smallestRangeI(vector<int> ...

  6. 海思HI2115芯片-NB-IOT模块向外发短信测试

    1. 说是有短信这个功能,测试下怎么使用?先使能BIP功能 AT+NCONFIG=ENABLE_BIP,TRUE 给SIM卡上电 AT+NUICC= 查询下短信中心服务号码 AT+CSCA? 发送短信 ...

  7. 【CUDA开发】CUDA开发琐碎知识

    ## 一维矩阵的加 //实现一个一维1*16的小矩阵的加法. //矩阵大小:1*16  //分配一个block,共有16个线程并发.  #include <stdio.h> #includ ...

  8. java的ReentrantLock类详解

    ReentrantLock 能用于更精细化的加锁的Java类, 通过它能更清楚了解Java的锁机制 ReentrantLock 类的集成关系有点复杂, 既有内部类, 还有多重继承关系 类的定义 pub ...

  9. springboot的propteis的基本配置参考

    其中mybatis.cfg.xml文件可以不加,这个文件最主要是开启mybatis的二级缓存:  

  10. 关于/etc/rc.local

    /etc/rc.d/rc.local 用于添加开机启动命令 /etc/rc.local是/etc/rc.d/rc.local的软连接 简单来说 开机自启的