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