正在查找有关fcntl和lockf中用于文件锁定的advantages和disadvantages的信息.例如,为了便于携带,哪个更好?我目前正在编写一个linux守护程序,想知道哪一个更适合用于强制互斥.
正在查找有关fcntl和lockf中用于文件锁定的advantages和disadvantages的信息.例如,为了便于携带,哪个更好?我目前正在编写一个linux守护程序,想知道哪一个更适合用于强制互斥.
What is the difference between lockf and fcntl:个
在许多系统上,lockf()
库 routine 只是fcntl()
左右的包装器.也就是说,lockf
提供了fcntl
所提供的功能的子集.
但在某些系统上,fcntl
和lockf
锁是完全独立的.
因为它依赖于实现,所以请确保始终使用相同的约定.因此,要么始终使用两个进程中的lockf,要么始终使用fcntl.它们很有可能可以互换,但使用同一个更安全.
你选了哪一个并不重要.
Some notes on mandatory vs advisory locks:个
unix/linux中的锁定默认为advisory,这意味着其他进程不需要遵循设置的锁定规则.因此,锁定哪种方式无关紧要,只要您的合作流程也使用相同的约定.
Linux确实支持mandatory锁定,但前提是您的文件系统安装时启用了选项并设置了文件特殊属性.您可以使用mount -o mand
装载文件系统,并将文件属性g-x,g+s
设置为启用强制锁定,然后使用fcntl
或lockf
.有关强制锁如何工作的更多信息,请参阅here.
请注意,锁定不是应用于单个文件,而是应用于索引 node .这意味着指向相同文件数据的2个文件名将共享相同的锁定状态.
另一方面,在视窗系统中,你可以主动独占地打开一个文件,这样挡路其他进程就不会完全打开它了.即使他们想这么做.也就是说,锁是强制的.Windows和文件锁定也是如此.具有适当访问权限的打开文件句柄的任何进程都可以锁定文件的一部分,其他进程将无法访问该部分.
How mandatory locks work in Linux:
关于强制锁定,如果进程使用读锁定锁定文件的某个区域,则允许其他进程读取该区域,但不允许写入该区域.如果进程使用写锁定锁定文件的某个区域,则不允许其他进程读取或写入该文件.当进程不允许访问文件部分时会发生什么,这取决于您是否指定了O_NONBLOCK
.如果设置了阻塞,它将等待执行该操作.如果没有设置阻塞,您将得到错误代码EAGAIN
.
NFS warning:个
在NFS装载上使用锁定命令时要小心.行为未定义,实现方式差异很大,是仅使用本地锁定还是支持远程锁定.