正在查找有关fcntllockf中用于文件锁定的advantagesdisadvantages的信息.例如,为了便于携带,哪个更好?我目前正在编写一个linux守护程序,想知道哪一个更适合用于强制互斥.

推荐答案

What is the difference between lockf and fcntl:

在许多系统上,lockf()库 routine 只是fcntl()左右的包装器.也就是说,lockf提供了fcntl所提供的功能的子集.

Source

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

Source

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

你选了哪一个并不重要.


Some notes on mandatory vs advisory locks:

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

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

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

另一方面,在视窗系统中,你可以主动独占地打开一个文件,这样挡路其他进程就不会完全打开它了.即使他们想这么做.也就是说,锁是强制的.Windows和文件锁定也是如此.具有适当访问权限的打开文件句柄的任何进程都可以锁定文件的一部分,其他进程将无法访问该部分.


How mandatory locks work in Linux:

关于强制锁定,如果进程使用读锁定锁定文件的某个区域,则允许其他进程读取该区域,但不允许写入该区域.如果进程使用写锁定锁定文件的某个区域,则不允许其他进程读取或写入该文件.当进程不允许访问文件部分时会发生什么,这取决于您是否指定了O_NONBLOCK.如果设置了阻塞,它将等待执行该操作.如果没有设置阻塞,您将得到错误代码EAGAIN.


NFS warning:

在NFS装载上使用锁定命令时要小心.行为未定义,实现方式差异很大,是仅使用本地锁定还是支持远程锁定.

C++相关问答推荐

错误:C中需要参数声明符

常数函数指针优化

编译的时候g++通常会比GCC慢很多吗?

C:二进制搜索和二进制插入

如何使用低级C++写出数值

X86/x64上的SIGSEGV,由于原始内存访问和C中的DS寄存器之间的冲突,在Linux上用TCC编译为JIT引擎

为什么函数是按照定义的顺序执行的,而不是按照从avr-c中的int main()调用的顺序执行的?

等同于铁 rust 的纯C语言S未实现!()宏

GCC错误,共享内存未定义引用?

C语言中奇怪的输出打印数组

我可以创建适用于不同endian的 colored颜色 struct 吗?

错误:字符串在C中获得意外输出

C23标准是否向后兼容?

当我将偏移量更改为任何非零值时,C中的mmap共享内存出现无效参数错误

Dlsym()的手册页解决方法仍然容易出错?

即使客户端不发送数据,也会发生UNIX套接字读取

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

为什么 Linux 共享库 .so 在内存中可能比在磁盘上大?

子进程不会修改父进程中的统计信息

如何确保 gcc + libc 对于多字节字符串使用 UTF-8,对于 wchar_t 使用 UTF-32?