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

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

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;
}
  
发布了55 篇原创文章 · 获赞 14 · 访问量 5787

猜你喜欢

转载自blog.csdn.net/YanWenCheng_/article/details/104090793