dram.me

Linux中的flock(2)

之前写过如何在SHELL中使用文件锁,这里对flock作更为详细的说明。

先说说advisory锁与mandatory锁的区别,从字面上理解,advisory是建议性的,而mandatory则是强制性的。advisory lock只是文件的一个属性,它并没有对文件的内容进行保护,程序在没有获得锁时仍然可以修改文件的内容。而mandatory lock则是对文件的内容进行保护。flock是一个advisory锁,所以文件的完整性是由程序保证的。这里对这两者有简单的说明。

在使用flock时,需要明确LOCK_SHLOCK_EX的概念。在一个文件被锁的前提下,如果该锁是LOCK_EX,所有其它请求LOCK_SHLOCK_EX的进程都将被block,当该锁是LOCK_SH时,进程请求LOCK_SH将被通过,而请求LOCK_EX将被block。

Linux中flock是基于file table实现的,所以在fork()或dup()之后,可以有多个fd共享锁,而解锁必须要显式地使用LOCK_UN或关闭所有与该file table entry相关联的fd。 最后,Wikipedia有对Linux及Windows中的文件锁比较详尽的说明,值得一读。