zoukankan      html  css  js  c++  java
  • fcntl 文件锁和struct flock

    当有多个进程要访问同一个文件的时候,为了防止多进程访问导致的不一致,我们就要考虑进程间的同步问题了。

     举例说明:在嵌入式编程中经常会遇到写配置文件的问题,这个时候由于多进程操作就需要跟配置文件加写锁操作。

    fcntl是一个非常强大的函数,在这里我们可以使用它来给文件的某一个部分上锁。先来看一下它的声明:

    int fcntl(int filedes, int cmd, ... /* struct flock *flockptr */ ); 

    这是一个拥有可变参数的函数声明,filedes自然是要操作的文件描述符,对与记录锁相关的操作,cmd只能是F_GETLK, F_SETLK, 或者 F_SETLKW,而第三个参数则必须是一个指向flock结构体的指针,来看一下该结构体的内部结构:

    1 struct flock {
    2     short l_type;/*F_RDLCK, F_WRLCK, or F_UNLCK */
    3     off_t l_start;/*offset in bytes, relative to l_whence */
    4     short l_whence;/*SEEK_SET, SEEK_CUR, or SEEK_END */
    5     off_t l_len;/*length, in bytes; 0 means lock to EOF */
    6     pid_t l_pid;/*returned with F_GETLK */
    7 };
    第一个成员是加锁的类型:只读锁,读写锁,或是解锁。l_start和l_whence用来指明加锁部分的开始位置,l_len是加锁的长度,l_pid是加锁进程的进程id。比如说,我们现在需要把一个文件的前三个字节加读锁,则该结构体的l_type=F_RDLCK, l_start=0, l_whence=SEEK_SET, l_len=3,l_pid不需要指定,然后调用fcntl函数时,cmd参数使用F_SETLK.
     
    leveldb用法:
     1 int LockOrUnlock(int fd, bool lock) {
     2   errno = 0;
     3   struct ::flock file_lock_info;
     4   std::memset(&file_lock_info, 0, sizeof(file_lock_info));
     5   file_lock_info.l_type = (lock ? F_WRLCK : F_UNLCK);
     6   file_lock_info.l_whence = SEEK_SET;
     7   file_lock_info.l_start = 0;
     8   file_lock_info.l_len = 0;  // Lock/unlock entire file.
     9   return ::fcntl(fd, F_SETLK, &file_lock_info);
    10 }
     
  • 相关阅读:
    课堂笔记-------字符串类型string------练习
    网络设计中需要考虑的时延latency差异
    ceph calamari 监控系统安装 on ubuntu 14.04
    Ceph性能优化总结(v0.94)
    创意点子
    “CEPH浅析”系列之八——小结
    “Ceph浅析”系列之七——关于Ceph的若干想法
    “CEPH浅析”系列之六——CEPH与OPENSTACK
    “Ceph浅析”系列之五——Ceph的工作原理及流程
    Ceph浅析”系列之四——Ceph的结构
  • 原文地址:https://www.cnblogs.com/kex1n/p/13055518.html
Copyright © 2011-2022 走看看