第一,场景

多进程之间的同步除了信号量、共享内存(原子操作)同步外,还可以使用文件锁定来完成。

二、实现

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(文件结尾)

相关推荐