zoukankan      html  css  js  c++  java
  • Linux文件锁flock ,检测进程是否已经存在

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

     头文件:#include<sys/file.h>
     函数:定义函数 int flock(int fd,int operation);
     
    1.阐述
    flock,建议性锁,不具备强制性。一个进程使用flock将文件锁住,另一个进程可以直接操作正在被锁的文件,修改文件中的数据,原因在于flock只是用于检测文件是否被加锁,针对文件已经被加锁,另一个进程写入数据的情况,内核不会阻止这个进程的写入操作,也就是建议性锁的内核处理策略。
     
    2.flock操作类型
    (1)LOCK_SH 共享锁,多个进程可以使用同一把锁,常被用作读共享锁;
    
    (2)LOCK_EX 排他锁,同时只允许一个进程使用,常被用作写锁;
    
    (3)LOCK_UN 释放锁;

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

    3.应用(供两种工作模式:阻塞与非阻塞类型。)

    (1)进程使用flock尝试锁文件时,如果文件已经被其他进程锁住,进程会被阻塞直到锁被释放掉

    服务会阻塞等待直到锁被释放:
    flock(lockfd,LOCK_EX)
    

    (2)在调用flock的时候,采用LOCK_NB参数,在尝试锁住该文件的时候,发现已经被其他服务锁住,会返回错误,errno错误码为EWOULDBLOCK

     服务会返回错误发现文件已经被锁住时:

    ret  = flock(lockfd,LOCK_EX|LOCK_NB)
    
    return:ret = -1, errno = EWOULDBLOCK 
    

    4.flock所释放:

    (1)调用LOCK_UN参数来释放文件锁

    (2)关闭该文件的方式来释放文件锁(flock会随着进程的关闭而被自动释放掉) 

    5.使用flock检测进程是否已经存在
     
    int checkexit(char* pfile){
         if (pfile == NULL)
              return -1;
    
         int lockfd = open(pfile,O_RDWR);//pfile 执行程序所在路径
         if (lockfd == -1)
              return -2;//打开文件出错
    
         int iret = flock(lockfd,LOCK_EX|LOCK_NB)
         if (iret == -1)
              return -3;//该进程已经存在
     
         return 0;
    }
    

    出处:http://blog.csdn.net/jiang1013nan/article/details/17849499

  • 相关阅读:
    Jstorm执行task报错windows CONFIG SET protected-mode no
    windows搭建redis集群最佳实践
    windows下golang实现Kfaka消息发送及kafka环境搭建
    go报错unimplemented: 64-bit mode not compiled in与mingw 64位安装报错ERROR res已解决
    GoLand配置数据库、远程host以及远程调试
    Go项目中beego的orm使用和gorm的使用
    windows下Go升级及GoLand的安装激活
    记一次解脱
    golang开源项目qor快速搭建网站qor-example运行实践
    使用img2html把图片转为网页
  • 原文地址:https://www.cnblogs.com/yaosj/p/6605579.html
Copyright © 2011-2022 走看看