美文网首页
C语言使用flock函数对文件加锁

C语言使用flock函数对文件加锁

作者: boldcautious | 来源:发表于2019-05-31 16:27 被阅读0次

lock.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <errno.h>
#include <string.h>

#define TRUE  1
#define FALSE 0

/**
 * @brief 尝试获取文件锁
 * @details 获取文件锁时不会阻塞进程, 获取不到锁时,立即返回不会等待
 * @param fd 文件描述符
 * @return 是否成功获取文件锁
 *   @retval TRUE 获取锁成功
 *   @retval FALSE 获取锁失败
 * @attention 这里只是建议性锁,每个使用上锁文件的进程都要检查是否有锁存在,
 * 内核不对读写操作做内部检查和强制保护
 */
int trylock_fd(int fd)
{
    if (flock(fd, LOCK_EX|LOCK_NB) == 0) {
        return TRUE;
    } else {
        return FALSE;
    }
}

/**
 * @brief 获取锁或等待
 * @details 获取文件锁时会阻塞进程, 获取不到锁时,一直等到获取成功
 * @param fd 文件描述符
 * @return 是否成功获取文件锁
 *   @retval TRUE 获取锁成功
 *   @retval FALSE 获取锁失败
 * @attention 这里只是建议性锁,每个使用上锁文件的进程都要检查是否有锁存在,
 * 内核不对读写操作做内部检查和强制保护
 */
int waitlock_fd(int fd)
{
    if (flock(fd, LOCK_EX) == 0) {
        return TRUE;
    } else {
        return FALSE;
    }
}

/**
 * @brief 释放文件锁
 * @param fd 文件描述符
 * @return 是否成功释放文件锁
 *   @retval TRUE 释放锁成功
 *   @retval FALSE 释放锁失败
 */
int unlock_fd(int fd)
{
    if (flock(fd, LOCK_UN) == 0) {
        return TRUE;
    } else {
        return FALSE;
    }
}

/**
 * @brief 主函数
 * @details 测试获取锁、释放锁的函数
 * @param argc 命令参数个数
 * @param argv 命令参数指针数组
 * @return 程序执行成功与否
 *   @retval 0 程序执行成功
 *   @retval 1 程序执行失败
 */
int main(int argc, char *argv[])
{
    int   fd;
    char *file;
    pid_t pid;

    if (argc == 2) {
        file = argv[1];
    } else {
        file = "file.lock";
    }

    pid = getpid();

    fd = open(file, O_RDWR|O_CREAT, 0666);
    if (fd < 0) {
        fprintf(stderr, "failed to open \"%s\", detail: %s(%d)\n",
                file, strerror(errno), errno);
        exit(1);
    }

    if(trylock_fd(fd)) {
        printf("file has been locked by %d. press any key to unlock\n", pid);
    } else {
        printf("waiting for lock\n");
        waitlock_fd(fd);
        printf("file has been locked by %d. press any key to unlock\n", pid);
    }
    
    getchar();
    unlock_fd(fd);
    printf("file has been unlocked by %d.\n", pid);
    close(fd);
    exit(0);
}

Makefile

CFLAGS= -Wall -O2 -g
OBJS=lock.o
lock: $(OBJS)
    gcc -o $@ $(OBJS)
clean:
    rm -rf lock $(OBJS) file.lock

编译

# make
cc -Wall -O2 -g   -c -o lock.o lock.c
gcc -o lock lock.o

验证

窗口1
# ./lock 
file has been locked by 23791. press any key to unlock
<-- 1) 按任意键,释放锁
file has been unlocked by 23791.
窗口2
# ./lock 
waiting for lock
<-- 等待锁释放,1)按下任意键后继续
file has been locked by 23792. press any key to unlock
<-- 2) 按任意键,释放锁
file has been unlocked by 23792.

相关文章

  • C语言使用flock函数对文件加锁

    lock.c Makefile 编译 验证 窗口1 窗口2

  • gcc

    C语言 c语言是面向函数的语言,所以c语言中全部都是函数 看看单文件中对函数的生命和调用。 要先对函数进行声明再进...

  • C语言使用fcntl对文件加锁

    加锁、解锁及测试代码 lock.c 编译 测试验证 窗口1 窗口2

  • 01-C语言和Go语言对比-指趣学院

    源文件对比 C语言源文件 Go语言源文件 代码管理对比 C语言中通过文件来管理代码想使用某一个函数时,只需要inc...

  • 2-Linux C语言指针与内存-学习笔记

    Linux C语言指针与内存 前面我们对于: c语言的基本用法 makeFile文件的使用 main函数的详解 标...

  • PHP文件加锁实现多进程读写同一文件

    php是不支持多线程的,可以通过加锁来实现多进程同时操作同一文件: flock函数的第二个参数的意义为:要取得共享...

  • (1)Cgo结构

    总结: 1、import "C" 是启用Cgo,以及cgo配置,头文件,C函数2、需要调用的C语言的内容使用/**...

  • 为什么在不同的.c文件中可以引用其他函数?

    对C语言的了解非常薄弱,想知道为什么在一个.c文件当中可以使用另外一个.c文件定以的函数,为了帮助问题的阐述,接下...

  • 标准I/O库

    文件的操作 文件的基本操作通常有读写增加操作,我们使用C语言的标准库来对文件进行操作使用fopen函数进行打开文件...

  • 2.头文件与类的声明

    C语言和C++语言中 函数与数据使用方法的不同 C语言中由于C语言中没有某些关键字,所以数据可以被全部函数所使用 ...

网友评论

      本文标题:C语言使用flock函数对文件加锁

      本文链接:https://www.haomeiwen.com/subject/ycdgtctx.html