昨天在研究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的更多相关文章

  1. flock — 轻便的咨询文件锁定

    bool flock  ( resource $handle  , int $operation  [, int &$wouldblock  ] ) handle  文件系统指针,是典型地由 ...

  2. Linux文件锁flock

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

  3. flock防止重复rsync

    我使用crontab同步一个文件夹时,发现一个问题,我在crontab中设置的1分钟运行一次.但当那个文件夹的内容改变时.1分钟不一定能同步完,但这时第二个rsync进行又起来了. 这个就产生一个问题 ...

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

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

  5. linux之flock函数锁文件

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

  6. linxu c语言 fcntl函数和flock函数区别 【转】

    flock和fcntl都有锁的功能,但他们还有一点小小的区别: 1.flock只能加全局锁,fcntl可以加全局锁也可以加局部锁. 2.当一个进程用flock给一个文件加锁时,用另一个进程再给这个文件 ...

  7. linux下C语言中的flock函数用法 【转】

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

  8. linux使用flock文件锁解决crontab冲突问题

    * * * * * flock -xn /dev/shm/redis.lock -c "/usr/local/bin/redis-server" 可以用flock命令,配合使用rs ...

  9. linux下一个C语言flock功能使用 .

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

  10. 每天进步一点点——Linux文件锁编程flock

    转载请注明出处:http://blog.csdn.net/cywosp/article/details/30083015 1. 场景概述     在多线程开发中.相互排斥锁能够用于对临界资源的保护,防 ...

随机推荐

  1. eDEX-UI

    eDEX-UI A science fiction terminal emulator disigned for large touchscreen that runs on all major OS ...

  2. java中变量关系

  3. SSH框架的搭建和测试(Spring + Struts2 + Hibernate)

    SSH框架实现了视图.控制器.和模型的彻底分离,同时还实现了业务逻辑层与持久层的分离. Spring实现了MVC中的 Controller的功能,Struts实现Web视图的功能,Hibernate则 ...

  4. jqgrid again

    之前有提及过jqgrid这个很不错的jquery grid, 非常适合企业MIS系统使用. 本文以一个显示学生成绩结果的页面, 来说明它的一些用法, 手写代码, 运行可能会报错, 不过思路是经过验证的 ...

  5. SQL Server 调用 C# 方法实现正则表达式验证

    Ø  前言 1.   在 SQL Server 中默认是不支持正则表达式验证的,如果需要某个字符串匹配一个正则表达式的验证规则,就需要额外的编写 C# 方法,并发布到 SQL Server 数据库中. ...

  6. 三十三、Linux 进程与信号——中断系统调用和函数可重入性

    33.1 中断系统调用 进程调用 “慢” 系统调用时,如果发生了信号,内核会重启系统调用. 慢系统调用 可能会永久阻塞的系统调用 从终端设备.管道或网络设备上的文件读取 向上述文件写入 某些设备上的文 ...

  7. 多线程this逃逸

    this逃逸,  是指在构造函数返回之前,其它线程就持有该对象的引用,调用尚未构造完全的对象的方法,可能引发令人疑惑的错误,应该避免this逃逸事件的发生. this逃逸经常发生在构造函数中启动线程或 ...

  8. Python常用模块之time模块

    python中的time和datetime模块是时间方面的模块 time模块中时间表现的格式主要有三种: 1.timestamp:时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算 ...

  9. python 的基础 学习 第四天 基础数据类型

    1,数字 int 数字主要是用于计算,使用方法并不是很多,就记住一种就可以. #bit_length() 当十进制用二进制表示时,转化为最少二进制的最少位数v = 11data = v.bit_len ...

  10. git部分提交

    ---git add 需要提交的文件----git stash -u -k -k 开关告诉仓库保持文件的完整. -u 开关告诉仓库包括无路径的文件(那些新的和未添加到git的)----git stas ...