linux文件有锁没法复制,Linux C 文件锁的操作

文件锁的类型

1 读锁

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

2 写锁

独占锁,如果A进程对文件的某个区域加了写锁,B进程就不能对此区域加写锁,也不能对此区域加读锁。

当多个进程同时对一个文件进行读写操作时,为确保文件的完整和一致性,这几个进程要加锁同步。

当进程开始读取文件的某个区域时,先加读锁,读完之后再解锁。

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(一般不用) */

}

l_type有F_RDLCK读锁、F_WRLCK写锁及F_UNLCK空锁。

(!!注意:读锁,不会影响数据,可以一直加;但是写锁,只能加一次)

l_whence有SEEK_SET、SEEK_CUR和SEEK_END。

l_len为0时表示从起点开始直至最大可能位置为止。

下面举个加写锁的例子:

#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;

}

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值