flock进程锁
作者:bin什么是flock进程锁:
标识唯一性的锁。
应用场景:
1、多个进程编辑同一个文件;
2、相同进程只能存在一个;
使用方法:
flock (fd, LOCK_EX|LOCK_NB);
参数
fd : 文件路径
操作类型 : flock主要三种操作类型:
LOCK_SH,共享锁,多个进程可以使用同一把锁,常被用作读共享锁; LOCK_EX,排他锁,同时只允许一个进程使用,常被用作写锁; LOCK_UN,释放锁,同时flock也会随着进程的关闭而被自动释放掉。 LOCK_NB,在尝试锁住该文件的时候,发现已经被其他服务锁住,会返回错误;
服务会阻塞等待直到锁被释放(进程等待):
flock(fd,LOCK_EX)
服务会返回错误发现文件已经被锁住时(返回错误码ret = -1, errno = EWOULDBLOCK ):
ret = flock(fd,LOCK_EX|LOCK_NB)
实例:
bool getFlock(const string& file) { int fd = open(file.c_str(), O_CREAT|O_RDONLY, 0666); if (fd == -1) { if (errno != ENOENT) { return false; } string baseDir = "/"; string path = file; if (testDir(baseDir, path) != 0) { return false; } fd = open(file.c_str(), O_CREAT|O_RDONLY, 0666); if (fd == -1) { return false; } } if (flock(fd, LOCK_EX | LOCK_NB) != 0) { return false; } return true; }