设为首页 加入收藏

TOP

Linux文件锁flock,检查程序是否已经运行
2015-02-02 14:51:00 来源: 作者: 【 】 浏览:20
Tags:Linux 文件 flock 检查 程序 是否 已经 运行

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


flock,建议性锁,不具备强制性。一个进程使用flock将文件锁住,另一个进程可以直接操作正在被锁的文件,修改文件中的数据,原因在于flock只是用于检测文件是否被加锁,针对文件已经被加锁,另一个进程写入数据的情况,内核不会阻止这个进程的写入操作,也就是建议性锁的内核处理策略。


flock主要三种操作类型:
? ? LOCK_SH,共享锁,多个进程可以使用同一把锁,常被用作读共享锁;
? ? LOCK_EX,排他锁,同时只允许一个进程使用,常被用作写锁;
? ? LOCK_UN,释放锁;


进程使用flock尝试锁文件时,如果文件已经被其他进程锁住,进程会被阻塞直到锁被释放掉,或者在调用flock的时候,采用LOCK_NB参数,在尝试锁住该文件的时候,发现已经被其他服务锁住,会返回错误,errno错误码为EWOULDBLOCK。即提供两种工作模式:阻塞与非阻塞类型。


服务会阻塞等待直到锁被释放:
flock(lockfd,LOCK_EX)
服务会返回错误发现文件已经被锁住时:
ret? = flock(lockfd,LOCK_EX|LOCK_NB)
同时ret = -1, errno = EWOULDBLOCK


flock锁的释放非常具有特色,即可调用LOCK_UN参数来释放文件锁,也可以通过关闭fd的方式来释放文件锁(flock的第一个参数是fd),意味着flock会随着进程的关闭而被自动释放掉。同时由于damon进程生成时会继承fd。故此方法有一定的局限性。


flock其中的一个使用场景为:检测进程是否已经存在;


int checkexit(char* pfile){
? ? if (pfile == NULL)
? ? ? ? ? return -1;
? ? int lockfd = open(pfile,O_RDWR);
? ? if (lockfd == -1)
? ? ? ? ? return -2;
? ? int iret = flock(lockfd,LOCK_EX|LOCK_NB)
? ? if (iret == -1)
? ? ? ? ? return -3;
? ? return 0;


}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux下串口通信编程 下一篇GCC选项_-Wl,-soname

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: