linux flock文件锁

函数简介
#include <sys/file.h>
int flock(int fd, int operation);
/*
 * fd: 想要加锁的文件描述符(该文件必须已经打开才能获得文件描述符)
 * operation: 加锁操作,共有 4 种情况:
 * LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
 * LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定,在文件上已经存在一个锁的情况下,函数会阻塞,直到该文件的所被解除。
 * LOCK_UN 解除文件锁定状态。
 * LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。
 * 单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。
 * 返回值:成功返回0,失败返回-1,同时错误码errno设置为相应的错误码。
 * 另外,关闭文件描述符会导致 flock 自动解锁。
*/
代码示例
/*
 * 此函数的使用很简单,代码套路大同小异
 * 此处的代码演示了互斥锁的使用
 * 同时程序执行结果说明了,关闭文件描述符会自动释放文件锁。
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/file.h>

int main()
{
    int fd = open("./flock.c", O_RDONLY);

    pid_t pid = fork();
    if (pid < 0)
        printf("fork failed.\n");
    else if (pid > 0)
    {
        if (flock(fd, LOCK_EX) == 0)
            printf("parent get flock success.\n");
        sleep(2);
        close(fd);
        printf("parent close file, and sleep 10s.\n");
        sleep(10);
    }
    else
    {
        sleep(2);
        if (flock(fd, LOCK_EX) == 0)
            printf("child get flock success.\n");
    }
    return 0;
}

试验结果如下图:
flock函数试验结果

备注:

  关闭文件描述符会自动释放文件锁,是一个很不错的优化,但是在多进程同步操作文件时,需要注意文件位置指针的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值