我想知道在使用fopen(不是open)打开文件时是否有办法在Linux中锁定和解锁文件?
基于Stack Overflow问题C fopen vs open,fopen优先于open.
如何通过创建和删除锁定文件来实现我自己的文件锁(如果可能)?
Rob*_*obᵩ 17
在Linux中,如果需要文件描述符(例如,传递给文件锁定原语),则可以使用fileno(FILE*)它来检索它.检索文件描述符后,您可以像使用它一样使用它open.
例如,而不是
int fd = open("myfile.txt", flags);
int result = flock(fd, LOCK_SH);
Run Code Online (Sandbox Code Playgroud)
你同样可以做到这一点:
FILE* f = fopen("myfile.txt", "r");
int result = flock(fileno(f)), LOCK_SH);
Run Code Online (Sandbox Code Playgroud)
请注意,这fileno是在POSIX标准中定义的,而不是在C或C++标准中定义的.
关于你的第二个问题,Linux open()手册页有这样的说法:
使用锁文件执行原子文件锁定的解决方案是在同一文件系统上创建一个唯一文件(例如,合并主机名和pid),使用link(2)建立到lockfile的链接.如果link()返回0,则锁定成功.否则,在唯一文件上使用stat(2)来检查其链接计数是否已增加到2,在这种情况下锁定也是成功的.
R..*_*R.. 17
我强烈的要求不一致fopen是首选了open.fopen由于没有O_EXCL选项,由于符号链接漏洞/竞争条件而在其他用户可写的目录中写入文件时,无法安全使用.如果您需要在POSIX系统使用标准输入输出,最好使用open和fdopen,而不是调用fopen直接.
现在,至于锁定,取决于你想做什么.POSIX没有像Windows那样的强制锁定,但如果您只想确保使用新文件而不是破坏现有文件或遵循符号链接,请根据需要使用O_EXCL和O_NOFOLLOW选项.如果要在初始打开之后进行协作锁定,请使用fcntl锁定.
可以使用锁定文件flock().它的语法是
#include <sys/file.h>
#define LOCK_SH 1 /* shared lock */
#define LOCK_EX 2 /* exclusive lock */
#define LOCK_NB 4 /* don't block when locking */
#define LOCK_UN 8 /* unlock */
int flock(int fd, int operation);
Run Code Online (Sandbox Code Playgroud)
使用fopen()或打开第一个文件open().然后使用flock()下面给出的锁定此打开的文件
int fd = open("test.txt","r");
int lock = flock(fd, LOCK_SH); // Lock the file . . .
// . . . .
// Locked file in use
// . . . .
int release = flock(fd, LOCK_UN); // Unlock the file . . .
Run Code Online (Sandbox Code Playgroud)