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



