温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Linux C 文件锁的操作

发布时间:2020-06-17 07:37:12 来源:网络 阅读:1404 作者:SherryX 栏目:系统运维

文件锁的类型

<br>

1 读锁

共享锁,如果A进程对文件的某区域加了读锁,B进程也可以在此区域加读锁,但是不能对此区域加写锁。

2 写锁

独占锁,如果A进程对文件的某个区域加了写锁,B进程就不能对此区域加写锁,也不能对此区域加读锁。
<br>
当多个进程同时对一个文件进行读写操作时,为确保文件的完整和一致性,这几个进程要加锁同步。
<br>
当进程开始读取文件的某个区域时,先加读锁,读完之后再解锁。
<br>

3 文件记录锁

文件记录锁
1.函数原型:int fcntl (int fd,int cmd,struct flck lock);
参数:fd:文件描述符;
   cmd:功能符号;(F_SETLK用来设置或释放锁; F_GETLK用来获得锁信息;)
   lock:存储锁信息的结构体指针;
   返回值:调用成功返回0,失败返回-1
2.锁信息结构体
struct flock
{
short l_type; /
锁的类型 /
short l_whence; /
偏移量的起始位置: /
off_t l_start; /
从l_whence的偏移量 /
off_t l_len; /
从l_start开始的字节数 /
pid_t l_pid; /
锁所属进程ID(一般不用) */
}
<br>
l_type有F_RDLCK读锁、F_WRLCK写锁及F_UNLCK空锁。
(!!注意:读锁,不会影响数据,可以一直加;但是写锁,只能加一次)

l_whence有SEEK_SET、SEEK_CUR和SEEK_END。

l_len为0时表示从起点开始直至最大可能位置为止。
<br>
下面举个加写锁的例子:

#include < stdio.h>
#include < unistd.h>
#include < fcntl.h>
/**
 int fctnl(int fd,int cmd,struct *lock);        //cmd:F_SETLK设置或解放锁;F_GETLK获得锁信息;返回值:0-成功,-1-失败
 struct flock{
    short l_type;           // of lock:F_RDLCK,F_WRLCK,F_UNLCK
    short l_whence;     //How to interpreter l_start:SEEK_SET,SEEK_CUR,SEEK_END
    off_t l_start;          //Starting offset for lock
    off_t l_len;                //Number of bytes to lock
    pid_t l_pid;                //PID of process blocking our lock(F_GETLK only)
};
*/

int main()
{
    int fd;
    int res;
    struct flock lock = {0};

    if((fd = open("a.txt",O_RDWR)) == -1)
    {
        fd = open("a.txt", O_CREAT);
    }
    if(fd == -1)
    {
        printf("file open failed!\n");
        return 1;
    }

//  printf("fd=%d\n",fd);

    //判断是否有锁
    res = fcntl(fd,F_GETLK,&lock);
    if(res == -1)
    {
        perror("判断有锁失败");
        return 1;
    }
    if(lock.l_type != F_UNLCK)
    {
        printf("fail:the file has locked!\n");
    }
    else    //上写锁,读锁可以一直加,写锁只能加一个
    {
        memset(&lock,0,sizeof(struct flock));
        lock.l_whence = SEEK_SET;
        lock.l_start = 0;
        lock.l_len = 10;
        lock.l_type = F_WRLCK;

        res = fcntl(fd,F_SETLK,&lock);
        if(res == -1)
        {
            perror("上锁失败");
            return 1;
        }
        //操作文件
        getchar();
        //解锁
        lock.l_type = F_UNLCK;
        res = fcntl(fd,F_SETLK,&lock);
        if(res == -1)
        {
            perror("解锁失败");
            return 1;
        }
    }

    close(fd);
    return 0;
}

<br>
关于多个进程上锁的问题,本质上步骤一样,后面复习中陆续再更...

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI