寻找有关 fcntl 和 lockf 的 优点 和 缺点 的信息以进行文件锁定。例如,哪个更适合用于便携性?我目前正在编写linux守护程序,并想知道哪种守护程序更适合用于执行互斥。 __ __
lockf和fcntl有什么区别:
在许多系统上,lockf()库例程只是的包装fcntl()。也就是说,lockf提供了该功能的子集fcntl。
lockf()
fcntl()
lockf
fcntl
资源
但是,在某些系统上,fcntl并且lockf锁是完全独立的。
由于它取决于实现,因此请确保始终使用相同的约定。因此,要么总是在两个进程中都使用lockf,要么总是使用fcntl。它们很可能会互换,但是使用相同的对象更安全。
选择哪一个都没关系。
关于强制锁和咨询锁的一些说明:
在UNIX锁定/ linux是默认 咨询 ,意味着其他进程并不需要遵循所设置的锁定规则。因此,只要您的协作过程也使用相同的约定,锁定哪种方式都没有关系。
Linux确实支持 强制 锁定,但前提是您的文件系统在选项为on且文件特殊属性已设置的情况下挂载。您可以使用mount -o mand挂载文件系统并设置文件属性g-x,g+s以启用强制性锁定,然后使用fcntl或lockf。有关强制锁如何工作的更多信息,请参见此处。
mount -o mand
g-x,g+s
请注意,锁并不应用于单个文件,而是应用于索引节点。这意味着指向相同文件数据的2个文件名将共享相同的锁定状态。
另一方面,在Windows中,您可以主动以独占方式打开文件,这将阻止其他进程完全打开该文件。即使他们想要。即,锁是强制性的。Windows和文件锁也是如此。具有打开的文件句柄且具有适当访问权限的任何进程都可以锁定文件的一部分,并且其他进程将无法访问该部分。
强制锁如何在Linux中工作:
关于强制性锁,如果某个进程使用读取锁锁定文件的某个区域,则其他进程将被允许读取但不能写入该区域。如果某个进程使用写锁定锁定文件的区域,则不允许其他进程读取或写入该文件。不允许进程访问文件部分时,会发生什么情况取决于您是否指定O_NONBLOCK。如果设置了阻止,它将等待执行该操作。如果未设置阻止,则将收到错误代码EAGAIN。
O_NONBLOCK
EAGAIN
NFS警告:
如果在NFS挂载上使用锁定命令,请小心。该行为是不确定的,并且实现是广泛变化的,是仅使用本地锁定还是支持远程锁定。