关于flock
昨天在研究dropbear实现时,看到初始化脚本/etc/init.d/dropbear中有关于文件锁lock的内容,如下:
lock /tmp/.switch2jffs
mkdir -p /etc/dropbear
mv /tmp/dropbear/dropbear_* /etc/dropbear/
lock -u /tmp/.switch2jffs
以为lock是linux命令,百度一下,发现没有这个命令,查找lock来源:
root@hbg:/# which lock
/bin/lock
root@hbg:/# ls -al /bin/lock
lrwxrwxrwx 1 root root 7 Jan 17 14:20 /bin/lock -> busybox
root@hbg:/#
在busybox中查看到了源码:
代码很简单,lock有三个参数可选:
root@hbg:/# lock -h
Usage: lock [-suw] <filename>
-s Use shared locking 使用共享锁
-u Unlock 解锁
-w Wait for the lock to become free, don't acquire lock 阻塞等待解锁
主要代码如下:
static int do_lock(void)
{
int pid;
char pidstr[8];
// 打开文件
if ((fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0700)) < 0) {
if ((fd = open(file, O_RDWR)) < 0) {
fprintf(stderr, "Can't open %s\n", file);
return 1;
}
}
// 加锁(共享锁或互斥锁)
if (flock(fd, (shared ? LOCK_SH : LOCK_EX)) < 0) {
fprintf(stderr, "Can't lock %s\n", file);
return 1;
}
pid = fork();
if (pid < 0)
return -1;
// 子进程
if (pid == 0) {
signal(SIGKILL, exit_unlock);
signal(SIGTERM, exit_unlock);
signal(SIGINT, exit_unlock);
if (waitonly)
exit_unlock(0);
else
while (1)
sleep(1);
} else {
// 父进程
if (!waitonly) {
lseek(fd, 0, SEEK_SET);
ftruncate(fd, 0);
sprintf(pidstr, "%d\n", pid);
write(fd, pidstr, strlen(pidstr));
close(fd);
}
return 0;
}
return 0;
通过代码可以看到调用的是flock函数。
=====================================
简单了解一下flock函数:
#include <sys/file.h>
int flock(int fd, int operation);
参数operation有一下四种情况:
LOCK_SH:建立共享锁,多个进程可以对同一个文件作共享锁定。
LOCK_EX:建立互斥锁,一个文件同时只有一个互斥锁定。
LOCK_UN:解除文件锁定状态。
LOCK_NB:无法建立锁定时,此操作可被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX做OR(|)组合。
单一文件无法同时建立共享锁定或互斥锁定,当使用dup()或fork()时文件描述词不会继承此种锁定。
返回0表示成功,-1表示错误,错误代码存于errno中。
flock只能对整个文件加锁,不能对文件的一部分进行加锁。
关于flock的更多相关文章
- flock — 轻便的咨询文件锁定
bool flock ( resource $handle , int $operation [, int &$wouldblock ] ) handle 文件系统指针,是典型地由 ...
- Linux文件锁flock
Linux文件锁flock 在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock. flock,建议性锁 ...
- flock防止重复rsync
我使用crontab同步一个文件夹时,发现一个问题,我在crontab中设置的1分钟运行一次.但当那个文件夹的内容改变时.1分钟不一定能同步完,但这时第二个rsync进行又起来了. 这个就产生一个问题 ...
- php原子操作,文件锁flock,数据库事务
php原子操作,文件锁flock,数据库事务 php没有继承posix标准支持的unix锁,只封装了一个linux系统调用flock(信号量也能做成锁),按理也是可以使用锁机制的,虽然效率低一点.ph ...
- linux之flock函数锁文件
头文件 #include<sys/file.h> 定义函数 int flock(int fd,int operation); 函数说明 flock()会依参数operation所指定 ...
- linxu c语言 fcntl函数和flock函数区别 【转】
flock和fcntl都有锁的功能,但他们还有一点小小的区别: 1.flock只能加全局锁,fcntl可以加全局锁也可以加局部锁. 2.当一个进程用flock给一个文件加锁时,用另一个进程再给这个文件 ...
- linux下C语言中的flock函数用法 【转】
表头文件 #include<sys/file.h> 定义函数 int flock(int fd,int operation); 函数说明 flock()会依参数operation所指 ...
- linux使用flock文件锁解决crontab冲突问题
* * * * * flock -xn /dev/shm/redis.lock -c "/usr/local/bin/redis-server" 可以用flock命令,配合使用rs ...
- linux下一个C语言flock功能使用 .
表头文件 #include<sys/file.h> 定义函数 int flock(int fd,int operation); 函数说明 flock()会依參数operation所指 ...
- 每天进步一点点——Linux文件锁编程flock
转载请注明出处:http://blog.csdn.net/cywosp/article/details/30083015 1. 场景概述 在多线程开发中.相互排斥锁能够用于对临界资源的保护,防 ...
随机推荐
- Hadoop — HDFS的概念、原理及基本操作
1. HDFS的基本概念和特性 设计思想——分而治之:将大文件.大批量文件分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析.在大数据系统中作用:为各类分布式运算框架(如:map ...
- URLSearchParams 接口
URLSearchParams 接口定义了很多个用来处理 URL 参数串的方法 他可以把对象转变成url上面查询信息的写法,例如a=1&b=2 可以把请求路由中的字符串 key=1 ,拼接 ...
- 使用JSX的注意事项
react中JSX是一种JavaScript + xml语法,用来创建虚拟DOM和声明组件.他可以更好的让我们读.写模板或组件. JSX语法浏览器是不识别的,需要通过babel 来进行转换成浏览器识别 ...
- JavaScript 实现一个简单的MVVM前端框架(ES6语法)
前言 随着前端各大框架的崛起,为我们平时的开发带来了相当的便利,我们不能一直停留在应用层面,今天就自己动手实现一个乞丐版的MVVM小框架 完整代码github地址 效果 html代码 <div ...
- Groovy 设计模式 -- Strategy 模式
策略模式 https://en.wikipedia.org/wiki/Strategy_pattern In computer programming, the strategy pattern (a ...
- oracle 窗口函数over
select *,sum(字段) over()from table :--相加所有行这个字段的和 select max(字段1),over(partition by 字段2,字段3) from ta ...
- UE4 编译笔记
UE4 的功能被分成了很多的模块,在API文档里每个类都有 Module 这个属性(值为模块名)每个模块使用其他模块要在Build.cs里导入,像vs里的引入库.在构建时 PublicDependen ...
- c2d遮罩
ClippingNode 节点 ClippingNode setStencil 设置模版 只有模版的区域显示此节点内容 使用了Opengl的 模板测试 http://www.cnblogs.com ...
- mybatis 动态sql 插入报错
1. 值为null必须制定jdbcType 单条执行的话,可以考虑把值为null的字段去掉 2. 值的类型无法解析 比如oracle.sql.TIMESTAMP类型,需转为java.sql.TIMES ...
- python - one day
1. python历史. 2008 年出现 python 2.7 与 python 3.0 两个版本,后来 吉多·范罗苏姆 大叔决定停用 python 2.7,但因用户反对,于是决定于 2020 年停 ...