进程同步--------文件锁的使用

本文深入探讨了文件锁的概念及其在进程同步中的应用,特别关注fcntl函数如何用于设置、获取和释放文件锁。通过代码示例展示了写锁和读锁的实现方式,以及它们在多进程环境下的行为特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件锁:只能在进程同步使用,因为线程共享文件描述符

fcntl函数:获取,设置文件访问控制属性;
参数2:
F_SETLK(struct flock*) 设置文件锁(trylock)//非阻塞
F_SETLKW(strcut flock *)设置文件锁(lock)//阻塞
F_GETLK(struct flock *)获取文件锁
参数3:struct flock{
short l_type; 锁的类型:F_RDLCK F_WRLCK F_UNLCK
short_l_whence; 偏移位置:SEEK_SET,SEEK_CUR,SEEK_END;
off_t l_start; 起始偏移:1000
off_t len; 长度:0表示整个文件加锁;
pid_t l _pid; 持有该锁的进程ID;
}
分析:参数三为写锁时,执行程序getlock只能给一个进程,为读锁时,多个进程都可获得getlock;
与线程同步的读写锁机制相似:写独占,读共享;

代码分析

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<pthread.h>
#include<sys/types.h>
#include<sys/stat.h>
int main(int argc ,char *argv[])
{
        int fd;
        if(argc<2)
        {
                printf("./file name\n");
                exit(1);
        }
        if((fd = open(argv[1],O_RDWR))<0)
        {
                perror("open error");
                exit(1);
        }

        struct flock f_lock;//定义锁的属性
        f_lock.l_type = F_WRLCK;//设置写锁
        //f_lock.l_type=F_RDLCK;//设置读锁
        f_lock.l_whence= SEEK_SET;
        f_lock.l_start=0;
        f_lock.l_len=0; //长度为0表示整个文件加锁


        fcntl(fd,F_SETLKW,&f_lock);
        printf("get lock\n");

        sleep(10);//模拟加锁之后对文件的操作
        f_lock.l_type=F_UNLCK;//设置解锁属性
        fcntl(fd,F_SETLKW,&f_lock);
        printf("un lock\n");

        close(fd);
        return 0;
}
  
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YanWenCheng_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值