概述
文件锁的类型
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=%dn",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;
}
关于多个进程上锁的问题,本质上步骤一样,后面复习中陆续再更...
最后
以上就是成就刺猬为你收集整理的Linux C 文件锁的操作的全部内容,希望文章能够帮你解决Linux C 文件锁的操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复