C语言文件锁的实现

说明

实现文件上锁的函数有flock和fcntl,其中flock用于对文件施加建议性锁,而fcntl不仅可以施加建议性锁,还可以施加强制锁。同时,fcntl还能对文件的某一记录进行上锁,也就是记录锁。

重复上锁

使用fcntl进行上锁后(此处为写入锁,读锁可重复上锁,写锁跟读锁跟写锁都不行),如果不解锁,本进程或者其他进程再次使用 fcntl(fd, F_SETLK, &Lock)命令访问同一文件则会告知目前此文件已经上锁加锁进程退出会自行解锁
int fcnt1(int fd, int cmd, struct flock *lock)

flock结构

flock 结构

struct flock      
{
short int l_type;     //锁定的状态  
short int l_whence; //决定l_start位置
off_t l_start;   //锁定区域的开头位置 
off_t l_len;   //锁定区域的长度,若为0,为全部
pid_t l_pid;   //锁定动作的进程
/*加锁整个文件,将 l_start = 0, l_whence = SEEK_SET,l_len = 0。*/
};

l_type 有三种状态:

F_RDLCK 建立一个供读取用的锁定 共享锁 readlock
F_WRLCK 建立一个供写入用的锁定 排他锁 writelock
F_UNLCK 删除之前建立的锁定 unlock

F_SETLK 设置文件锁定的状态。此时flcok 结构的l_type 值必须是F_RDLCK、F_WRLCK或F_UNLCK。如果无法建立锁定,则返回-1,错误代码为EACCES 或EAGAIN。

代码块,

此处代码为给.dmdbw_run_m10上写锁(排他锁),同时有两程序运行时lock_file(fd)会上锁失败,exit退出程序。

#include <sys/fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>


```c
int lock_file(int fd)
{
	struct flock L1;
	L1.l_type = F_WRLCK;
	L1.l_start = 0;
	L1.l_whence = SEEK_SET;
	L1.l_len = 0;
	/* F_SETLK: 设置锁 */
	return (fcntl(fd, F_SETLK, &L1));
}

int main(int argc, char **argv)
{
	
	int fd;
	
	/* ORDWR:  以可读写方式打开文件
	 * OCREAT: 如文件不存在,则创建该文件 */
	fd = open(".dmdbw_run_m10", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
	if(fd < 0){  //打开失败
		exit(1);
	}
	
	if(lock_file(fd) == -1)  //-1上锁失败,无法锁定,存在冲突的写入锁
	{
	    printf("on  running\n");
		close(fd);
		exit(0);
	}
	
	printf("not running\n");
	getchar();
 
    close(fd);
    return 0;
}

如有错误,希望能留言指正,感谢。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

自不量力的A同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值