linux检测文件是否加锁,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;

}

example 1

#define FILE_NAME "/tmp/filelock"

#include

#include

#include

int main(int argc , char *agvv[])

{

int fd;

fd = open(FILE_NAME,O_CREAT|O_RDWR,0666);

if( fd == -1)

return -1;

int ret = flock(fd,LOCK_EX|LOCK_NB);

if(ret == 0)

{

printf("first run!\n");

sleep(10);

}else{

printf("already run!\n");

}

return 0;

}

但是使用以上文件锁,会将锁同时传递给子进程或者是由此进程fork出来的deamon进程。此时如果想使用检查程序是否已经存在的方法,就要使用另外一种文件锁。

example2

#define FILE_NAME "/tmp/filelock"

#include

#include

#include

int Lockfile(const int iFd)

{

struct flock stLock;

stLock.l_type = F_WRLCK; /* F_RDLCK, F_WRLCK, F_UNLCK */

stLock.l_start = 0; /* byte offset, relative to l_whence */

stLock.l_whence = SEEK_SET; /* SEEK_SET, SEEK_CUR, SEEK_END */

stLock.l_len = 0; /* #bytes (0 means to EOF) */

return (fcntl(iFd, F_SETLK, &stLock));

}

int main(int argc , char *agvv[])

{

int fd;

fd = open(FILE_NAME,O_CREAT|O_RDWR,0666);

if( fd == -1)

return -1;

int ret = Lockfile(fd);

if(ret == 0)

{

printf("first run!\n");

sleep(10);

}else{

printf("already run!\n");

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值