经过我的研究,我仍然不确定是否有API允许您专门打开文件,这意味着任何其他进程都无法直接访问该文件。 请有人给我一个很好的参考/指南/说明/手册,涵盖这个主题吗? 非常感谢!
编辑:咨询锁定已经足够了。
答案 0 :(得分:1)
进程之间有三个主要的文件锁定系统:
某些类Unix系统可能没有flock()
;例如,他们可能会lockf()
,或者他们可能只有fcntl()
锁定(尽管大多数会同时拥有lockf()
和fcntl()
,而且很多人会flock()
太)。当前版本的POSIX要求fcntl()
锁定和lockf()
锁定文件级进程间锁定。 (POSIX还定义了flockfile()
,funlockfile()
和ftrylockfile()
- 用于控制应用程序中线程之间的锁定。)
AFAIK,您可以使用lockf()
锁定来实现flock()
和fcntl()
锁定。
请注意,锁定功能适用于文件描述符或文件流。每个程序都可以打开文件,但会应用咨询锁定调用来检查它是否具有对该文件的独占访问权。
请注意,某些系统支持强制文件锁定(通过在文件上设置setgid位来指示,而未设置相应的组执行位 - 例如2644模式)。但是,Mac OS X不支持强制锁定(10.10 Yosemite测试,但先前版本也有此限制)。 POSIX不需要强制锁定支持。它是在SVR4系统上提供的。
答案 1 :(得分:0)
为防止文件从多个进程读取,所有这些都必须实现相同的锁定机制。
一种方法是使用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.
另一种方法是使用 lockfile - 文件与原始文件一起表示锁定处于活动状态。 C11在fopen
中为模式指定了一个修饰符x
,它确保始终创建文件,如果文件已经存在则不会打开:
FILE * f = fopen("filename.lock", "wx");
if (!f) {
// File already exists!
return 0;
}
// Do stuff
fclose(f);
remove("filename.lock");