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

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

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

 

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

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

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

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

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

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

 

4.flock所释放:

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

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

 

5.使用flock检测进程是否已经存在
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

posted @   翻白眼的哈士奇  阅读(2985)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示