如何使用fopen()锁定文件?

Ami*_*mir 18 c linux

我想知道在使用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,在这种情况下锁定也是成功的.

  • @EdHeal:Streams有缓冲区,这意味着你必须小心在适当的时候进行刷新. (3认同)

R..*_*R.. 17

我强烈的要求不一致fopen是首选了open.fopen由于没有O_EXCL选项,由于符号链接漏洞/竞争条件而在其他用户可写的目录中写入文件时,无法安全使用.如果您需要在POSIX系统使用标准输入输出,最好使用openfdopen,而不是调用fopen直接.

现在,至于锁定,取决于你想做什么.POSIX没有像Windows那样的强制锁定,但如果您只想确保使用新文件而不是破坏现有文件或遵循符号链接,请根据需要使用O_EXCLO_NOFOLLOW选项.如果要在初始打开之后进行协作锁定,请使用fcntl锁定.


Yog*_*H T 5

可以使用锁定文件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)

  • `open()` 不接受模式的字符串参数。那是`fopen()`。但话又说回来, fopen 不返回一个 int ,而是一个 FILE* 。请编辑以准确说明您要使用的内容 (3认同)