防止从不同进程打开文件两次

时间:2014-11-12 11:59:25

标签: c++ c macos file-locking

经过我的研究,我仍然不确定是否有API允许您专门打开文件,这意味着任何其他进程都无法直接访问该文件。 请有人给我一个很好的参考/指南/说明/手册,涵盖这个主题吗? 非常感谢!

编辑:咨询锁定已经足够了。

2 个答案:

答案 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");