[英]Preventing opening file twice from different processes
经过研究后,我仍然不确定是否有API允许您专门打开文件,这意味着任何其他进程都无法访问该文件。 请有人能给我一个涵盖该主题的良好参考/指南/说明/手册吗?
非常感谢!
编辑:咨询锁定足够好。
进程之间有三种主要的文件锁定系统:
一些类Unix系统可能没有flock()
; 例如,它们可能具有lockf()
,或者它们可能仅具有fcntl()
锁定(尽管大多数将同时具有lockf()
和fcntl()
而许多也将具有flock()
)。 当前版本的POSIX要求fcntl()
锁定和lockf()
锁定用于文件级进程间锁定。 (POSIX还定义了flockfile()
, funlockfile()
和ftrylockfile()
,它们用于控制应用程序中线程之间的锁定)。
AFAIK,您可以使用fcntl()
锁定来实现lockf()
和flock()
fcntl()
锁定。
请注意,锁定功能适用于文件描述符或文件流。 每个程序都可以打开文件,但是随后将应用咨询性锁定调用以检查它是否具有对该文件的独占访问权。
请注意,某些系统支持强制性文件锁定(通过在未设置相应的组执行位的情况下在文件上设置setgid位来表示-例如2644模式)。 但是,Mac OS X不支持强制锁定(已测试10.10 Yosemite,但以前的版本也有此限制)。 POSIX不需要强制锁定支持。 它是在SVR4系统上提供的。
为了防止从多个进程读取文件,所有进程都必须实现相同的锁定机制。
一种方法是使用flock
机制,但并不是到处都有。 从flock(2)
联机帮助页:
CONFORMING TO
4.4BSD (the flock() call first appeared in 4.2BSD).
A version of flock(), possibly implemented in terms of fcntl(2),
appears on most UNIX systems.
另一种方法是使用锁文件 -与原始文件一起显示锁处于活动状态的文件。 C11在fopen
为模式指定了一个修饰符x
,以确保始终创建文件且如果文件已经存在则不打开:
FILE * f = fopen("filename.lock", "wx");
if (!f) {
// File already exists!
return 0;
}
// Do stuff
fclose(f);
remove("filename.lock");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.