1
60
lockf和fcntl有什么区别:
在许多系统上,
但在某些系统上,
由于它依赖于实现,请确保始终使用相同的约定。因此,要么始终使用两个进程中的lockf,要么始终使用fcntl。它们很有可能是可以互换的,但使用同一个更安全。 你选择哪一个无关紧要。 关于强制锁和咨询锁的一些说明: 默认情况下,在UNIX/Linux中锁定 咨询的 ,这意味着其他进程不需要遵循设置的锁定规则。所以无论您锁定的方式是什么,只要您的合作过程也使用相同的约定。
Linux确实支持
强制性的
锁定,但仅当安装了文件系统并设置了选项on和文件特殊属性时。你可以用
请注意,锁不是应用于单个文件,而是应用于inode。这意味着指向相同文件数据的两个文件名将共享相同的锁定状态。 另一方面,在Windows中,您可以以独占方式打开一个文件,这将阻止其他进程完全打开该文件。即使他们愿意。也就是说,锁是强制性的。Windows和文件锁也是如此。具有适当访问权限的打开文件句柄的任何进程都可以锁定文件的一部分,其他进程将无法访问该部分。 Linux中强制锁的工作方式:
关于强制锁,如果一个进程用读取锁锁定了文件的某个区域,那么其他进程就可以读取但不能写入该区域。如果一个进程用写锁锁定了文件的某个区域,则不允许其他进程读取或写入该文件。如果不允许进程访问文件的一部分,则会发生什么情况取决于您是否指定了
NFS警告: 如果在NFS装载上使用锁定命令,请小心。这种行为是未定义的,无论是只使用本地锁还是支持远程锁,实现方式都有很大的不同。 |
2
10
这两个接口都是POSIX标准的一部分,现在这两个接口在大多数系统上都可用(我刚刚检查了Linux、FreeBSD、Mac OS X和Solaris)。因此,选择一个更适合您的需求并使用它。 一句警告:当一个进程使用fcntl锁定文件,另一个进程使用lockf锁定文件时,会发生什么,这是未指定的。在大多数系统中,这些操作都是等效的(实际上,在Linux中,lockf是在fcntl之上实现的),但是posix说它们的交互是未指定的。因此,如果您正在与使用这两个接口之一的另一个进程进行交互操作,请选择相同的接口。 其他人则写道,这些锁只是建议性的:您负责检查某个区域是否被锁定。此外,如果要使用锁定功能,请不要使用stdio函数。 |
3
9
您的主要关注点,在这种情况下(即 对Linux守护进程进行编码 想知道哪个更适合使用 用于强制相互排斥 “”,应该是:
这个
我的建议是
|
4
7
最近我在使用fcntl和flock时遇到了一个问题,我觉得我应该在这里报告,因为搜索任何一个术语都会在这两个术语的顶部显示此页面。 如上所述,BSD锁是 咨询的 . 对于那些不知道奥斯陆(达尔文)是BSD的人来说。打开要写入的文件时必须记住这一点。 要使用fcntl/flock,必须首先打开文件并获取其ID。但是,如果已使用“w”打开文件,则文件将立即 归零 . 如果您的进程在其他地方使用该文件时未能获得锁,那么它很可能会返回,将文件保留为0KB。拥有锁的过程现在会发现文件已经从它下面消失了,灾难性的结果通常会随之而来。 为了解决这种情况,在使用文件锁定时, 从未 打开文件“w”,而不是打开它“a”,以附加。然后,如果成功获取锁,则可以安全地将文件清除为“w”,即: fseek(filehandle,0,seek_set);//移动到开始 ftruncate(fileno((file*)filehandle),0);//清除 这对我来说是一个不愉快的教训。 |
5
1
因为您只对一个守护进程进行编码,而这个守护进程使用它进行互斥,所以它们是等效的,毕竟,您的应用程序只需要与自身兼容。 文件锁定机制的诀窍是保持一致——使用一个并坚持下去。改变它们是个坏主意。 我在这里假设文件系统是本地的-如果不是,那么所有的赌注都是关闭的,NFS/其他网络文件系统以不同的有效性处理锁定(在某些情况下没有)。 |
7BeholdeR7 · 文件夹的重量超过其中的文件(六倍) 2 年前 |
ilteris · 为什么程序在fscanf后崩溃 2 年前 |
Peaceful · 使用fscanf读取C中具有未知行数的文件 2 年前 |
NOCi · 如何将Tensorflow的结果记录到CSV文件 2 年前 |
Oakzeh · 如何在字符串索引之前读取文件并删除字符 2 年前 |