lockf 函数是 Linux 系统中的一个文件锁定机制,它可以在多进程环境中对文件进行加锁和解锁操作
lockf 函数的原型如下:
#include <unistd.h>long lockf(int fd, int operation, off_t size);参数说明:
fd:需要锁定或解锁的文件描述符。operation:指定锁定或解锁的类型,可以是以下值之一:LOCK_UN:解锁文件。LOCK_EX:锁定文件,如果文件已被锁定,则返回错误。LOCK_SH:以共享模式锁定文件,其他进程可以继续锁定该文件。LOCK_NB:以非阻塞模式锁定文件,如果文件已被锁定,则立即返回错误。LOCK_EX | LOCK_NB:以独占且非阻塞模式锁定文件。size:指定锁定范围的大小,通常设置为 0,表示锁定整个文件。在多进程环境中,lockf 函数可以确保同一时间只有一个进程访问被锁定的文件。这有助于防止数据竞争和不一致的问题。
以下是一个简单的示例,展示了如何在两个进程中使用 lockf 函数:
进程 1(锁定文件):
#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <sys/file.h>int main() { int fd = open("test.txt", O_RDWR); if (fd == -1) { perror("open"); return 1; } // 以独占且非阻塞模式锁定文件 if (lockf(fd, LOCK_EX | LOCK_NB, 0) == -1) { if (errno == EWOULDBLOCK) { printf("File is locked by another process.\n"); } else { perror("lockf"); } close(fd); return 1; } // 对文件进行操作,例如读取或写入数据 // 解锁文件 if (lockf(fd, LOCK_UN, 0) == -1) { perror("lockf"); close(fd); return 1; } close(fd); return 0;}进程 2(尝试锁定文件):
#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <sys/file.h>int main() { int fd = open("test.txt", O_RDWR); if (fd == -1) { perror("open"); return 1; } // 尝试以独占且非阻塞模式锁定文件 if (lockf(fd, LOCK_EX | LOCK_NB, 0) == -1) { if (errno == EWOULDBLOCK) { printf("File is locked by another process.\n"); } else { perror("lockf"); } close(fd); return 1; } // 文件已被锁定,无法进行操作 // 解锁文件 if (lockf(fd, LOCK_UN, 0) == -1) { perror("lockf"); close(fd); return 1; } close(fd); return 0;}在这个示例中,进程 1 首先锁定文件,然后对文件进行操作。进程 2 尝试锁定同一文件,但由于文件已被锁定,因此无法进行操作。当进程 1 完成操作并解锁文件后,进程 2 可以继续尝试锁定文件。