gpt4 book ai didi

c - fcntl,lockf,哪个更好用于文件锁定?

转载 作者:IT老高 更新时间:2023-10-28 12:36:00 36 4
gpt4 key购买 nike

寻找有关 fcntllockf 的优点缺点的信息 用于文件锁定。例如,哪个更适合便携性?我目前正在编写一个 linux 守护进程,想知道哪个更适合用于强制互斥。

最佳答案

lockf和fcntl有什么区别:

在许多系统上,lockf() 库例程只是 fcntl() 的包装。也就是说 lockf 提供了 fcntl 所提供的功能的一个子集。

Source

但在某些系统上,fcntllockf 锁是完全独立的。

Source

由于它依赖于实现,请确保始终使用相同的约定。因此,要么始终从您的两个进程中使用 lockf,要么始终使用 fcntl。它们很有可能可以互换,但使用同一个更安全。

你选择哪一个并不重要。


关于强制与建议锁定的一些说明:

unix/linux 中的锁定默认是advisory,这意味着其他进程不需要遵循设置的锁定规则。因此,您锁定哪种方式并不重要,只要您的合作流程也使用相同的约定即可。

Linux 确实支持强制锁定,但前提是您的文件系统安装时使用了选项 on 并设置了文件特殊属性。可以使用mount -o mand挂载文件系统并设置文件属性g-x,g+s开启强制锁,然后使用fcntllockf。有关强制锁如何工作的更多信息,请参阅 here .

请注意,锁不是应用于单个文件,而是应用于 inode。这意味着指向相同文件数据的 2 个文件名将共享相同的锁定状态。

另一方面,在 Windows 中,您可以主动以独占方式打开文件,这将阻止其他进程完全打开它。即使他们愿意。即,锁是强制性的。 Windows 和文件锁也是如此。任何具有适当访问权限的打开文件句柄的进程都可以锁定文件的一部分,并且没有其他进程能够访问该部分。


强制锁在 Linux 中的工作原理:

关于强制锁,如果一个进程用读锁锁定文件的一个区域,那么其他进程可以读取但不能写入该区域。如果一个进程用写锁锁定了文件的一个区域,那么其他进程就不能读取或写入该文件。当不允许进程访问文件的一部分时会发生什么取决于您是否指定了 O_NONBLOCK。如果设置了阻塞,它将等待执行操作。如果未设置阻塞,您将收到 EAGAIN 的错误代码。


NFS 警告:

如果您在 NFS 挂载上使用锁定命令,请务必小心。该行为是未定义的,并且无论是仅使用本地锁还是支持远程锁,实现都存在很大差异。

关于c - fcntl,lockf,哪个更好用于文件锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/575328/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com