问:为什么要使用文件锁?
答:当多个用户共同使用、操作一个文件的情况时,Linux采用的方法就是给文件上锁,来避免共享的资源产生竞争的状态。
问:文件锁有哪些类型?
答:文件锁包括建议性锁和强制性锁。一般情况下,内核和系统都不适用建议性锁,采用强制性锁的影响很大,每次读写操作都必须检查是否有所存在。
问:建议性锁/强制性锁的定义?
建议性锁是指给文件上锁后,只在文件上设置了一个锁的标识。其他进程在对这个文件进程操作时,可以检测到锁的存在,但这个锁并不能阻止它对这个文件进行操作。这就好比红绿灯,当亮红灯时,告诉你不要过马路,但如果你一定要过,也拦不住你。
强制性锁则是当给文件上锁后,当其他进程要对这个文件进程不兼容的操作(如上了读锁,另一个进程要写),则系统内核将阻塞后来的进程直到第一个进程将锁解开
问:怎样实现文件上锁?
答:在Linux中,实现文件上锁的函数有lockf() 和fcntl() ,其中lockf()用于对文件施加建议性锁,而fcntl() 不仅可以施加建议性锁,而且可以施加强制性锁。fcntl()还能对文件的某一记录上锁,也就是记录锁。记录锁又可分读取锁(共享锁)和写入锁(排斥锁),文件的同一部分不能同时建立读取锁和写入锁。
借助fcntl
函数来实现锁机制
int fcntl(int fd, int cmd, .../* struct flock *flockptr */ );
参2:
F_GETLK GET:用来测试锁,注意是测试而不是获取锁
F_SETLK SET:用来[非阻塞式]加锁(trylock)、解锁(unlock)
F_SETLKW SET:用来[阻塞式]加锁(lock)、解锁(unlock)
参3:
struct flock {
short l_type; 锁的类型:F_RDLCK共享读锁 、F_WRLCK独占写锁 、F_UNLCK解锁
short l_whence; 偏移位置:SEEK_SET、SEEK_CUR、SEEK_END
off_t l_start; 起始偏移字节数
off_t l_len; 长度
//当文件被上锁时,使用测试锁F_GETLK时,l_pid将被赋值为当前对文件加锁的进程的pid
pid_t l_pid; 持有该锁的进程ID
};
对整个文件加锁:(l_start=0、l_whence=SEEK_SET)指向文件起始位置,l_len设为0
F_SETLK 、F_SETLKW 加锁 / 解锁
F_GETLK 测试是否能加type类型的锁