一、场景
多进程间同步除了信号量、共享内存(原子操作)同步外,还可以使用文件锁来实现。
二、实现
linux中有两种是方式,分别是flock()函数和fcntl()函数。使用效果大致相同
flock函数:
fd:文件描述符
operation:LOCK_SH(添加共享锁,相当于读锁),LOCK_EX(添加排他锁,相当于写锁),LOCK_UN(去除添加到文件的锁,解锁),
LOCK_NB(其可以和LOCK_SH和LOCK_EX组合使用,默认单独使用LOCK_SH和LOCK_EX在没有得到锁资源的情况下,会阻塞,那么添加LOCK_NB,自然就是不阻塞,直接返回结果)
fcntl函数:
使用文件锁则是:
int fcntl(int fd, int cmd, struct flock *);
struct flock定义:
fd:文件描述符
cmd:F_GETLK(获取文件锁的信息,查询),F_SETLK(设置文件锁信息,加锁、解锁、默认不阻塞),F_SETLKW(设置文件锁信息,加锁、解锁、默认阻塞)
struct flock l_type:F_RDLCK(读锁),F_WRLCK(写锁),F_UNLCK(解锁)
struct flock l_whence:文件具体加锁的位置,使用的时候设置同一位置就可以达到加锁的效果,SEEK_SET(文件开头),SEEK_CUR(文件当前位置),SEEK_END(文件结尾)