文件锁fcntl()函数的使用

原创 2012年07月17日 21:01:36

问:为什么要使用文件锁?

答:当多个用户共同使用、操作一个文件的情况时,Linux采用的方法就是给文件上锁,来避免共享的资源产生竞争的状态。

问:文件锁有哪些类型?

答:文件锁包括建议性锁和强制性锁。一般情况下,内核和系统都不适用建议性锁,采用强制性锁的影响很大,每次读写操作都必须检查是否有所存在。

问:怎样实现文件上锁?

答:在Linux中,实现文件上锁的函数有lockf() 和fcntl() ,其中lockf()用于对文件施加建议性锁,而fcntl() 不仅可以施加建议性锁,而且可以施加强制性锁。fcntl()还能对文件的某一记录上锁,也就是记录锁。记录锁又可分读取锁(共享锁)和写入锁(排斥锁),文件的同一部分不能同时建立读取锁和写入锁。

fcntl()使用实例:

文件记录锁功能源代码:

/*
 * lock_set.c
 *
 *  Created on: 2012-7-17
 *      Author: liwei.cai
 */
int lock_set(int fd, int type)
{
	struct flock old_lock, lock;
	lock.l_whence = SEEK_SET;
	lock.l_start = 0;
	lock.l_len = 0;
	lock.l_type = type;
	lock.l_pid -1;

	//判断文件是否上锁
	fcntl(fd, F_GETLK, &lock);
	if (lock.l_type != F_UNLCK)
	{
		//判断文件不能上锁的原因
		if (lock.l_type == F_RDLCK) //该文件已有读取锁
		{
			printf("Read lock already set by %d .\n", lock.l_pid);
		}
		else if(lock.l_type == F_WRLCK) //该文件已有写入锁
		{
			printf("Write lock already set by %d .\n", lock.l_pid);
		}
	}
	//l_type 可能已被F_FETLK修改过
	lock.l_type = type;

	//根据不同的type值进行阻塞式上锁或解锁
	if((fcntl(fd, F_SETLKW, &lock)) < 0)
	{
		printf("Lock failed:type = %d\n", lock.l_type);
		return 1;
	}

	switch(lock.l_type)
	{
	case F_RDLCK:
		{
			printf("Read lock set by %d \n", getpid());
		}
		break;
	case F_WRLCK:
		{
			printf("Write lock set by %d \n", getpid());
		}
		break;
	case F_UNLCK:
		{
			printf("Release lock by %d \n", getpid());
			return 1;
		}
		break;
	default:
		break;
	}
	return 0;
}

文件写入锁的测试用例,这里首先创建了一个“hello”文件,之后对其上写入锁,最后释放写入锁。

/*
 * write_lock.c
 *
 *  Created on: 2012-7-17
 *      Author: liwei.cai
 */
#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include "lock_set.c"

int main()
{
	int fd;

	//首先打开文件
	fd = open("hello", O_RDWR|O_CREAT, 0644);
	if (fd < 0)
	{
		printf("Open file error!\n");
		exit(1);
	}
	//给文件上写入锁
	lock_set(fd, F_WRLCK);
	getchar();
	//给文件解锁
	lock_set(fd, F_UNLCK);
	getchar();
	close(fd);
	exit(0);
}
建议开启两个终端,并且同时运行该程序,以达到多个进程操作一个文件的效果,并查看结果。

读取锁与写入锁类似。

/*
 * fcntl_read.c
 *
 *  Created on: 2012-7-17
 *      Author: liwei.cai
 */
#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include "lock_set.c"

int main()
{
	int fd;

	//首先打开文件
	fd = open("hello", O_RDWR|O_CREAT, 0644);
	if (fd < 0)
	{
		printf("Open file error!\n");
		exit(1);
	}
	//给文件上写入锁
	lock_set(fd, F_RDLCK);
	getchar();
	//给文件解锁
	lock_set(fd, F_UNLCK);
	getchar();
	close(fd);
	exit(0);
}
从结果中可以很好的看出共享锁与排斥锁的区别。


fcntl 对文件加锁示例

fcntl, flock, 加锁
  • konga
  • konga
  • 2016年04月30日 16:30
  • 1162

linux系统编程之文件与I/O(六):fcntl 函数与文件锁

一、fcntl函数 功能:操纵文件描述符,改变已打开的文件的属性 int fcntl(int fd, int cmd, ... /* arg */ ); cmd的取值可以如下: 复制文件描述符...
  • Simba888888
  • Simba888888
  • 2013年05月14日 11:26
  • 11449

文件锁使用原理及其方法

关于读写文件时文件锁的一些问题。  bool flock ( int handle, int operation);      man 2 flock 就可以查看flock的一些信息。  flock(...
  • hjs1122
  • hjs1122
  • 2011年03月17日 10:53
  • 2073

linux下的简单文件读写锁的操作

设置文件锁/* lock_set.c */ int lock_set(int fd, int type) { struct flock old_lock, lock; lock.l_whence...
  • u011046042
  • u011046042
  • 2016年05月27日 21:03
  • 2377

fcntl函数详解

功能描述:根据文件描述词来操作文件的特性。 #include #include   int fcntl(int fd, int cmd);  int fcntl(int fd, int ...
  • pbymw8iwm
  • pbymw8iwm
  • 2012年09月13日 14:06
  • 22099

文件上锁lockf() 和fcntl()

在Linux中,实现文件上锁的函数有lockf() 和fcntl() ,其中lockf()用于对文件施加建议性锁,而fcntl() 不仅可以施加建议性锁,而且可以施加强制性锁。fcntl()还能对文件...
  • Doraemon___
  • Doraemon___
  • 2016年10月25日 21:44
  • 830

lockf的用法

lockf用法2010-04-19 21:19lockf()函数允许将文件区域用作信号量(监视锁),或用于控制对锁定进程的访问(强制模式记录锁定)。试图访问已锁定资源的其他进程将返回错误或进 入休眠状...
  • babyfans
  • babyfans
  • 2010年12月31日 10:56
  • 2217

linux进程控制(fork,getpid,lockf)

编写一段程序(程序命名为fork()),使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和2个子进程活动。让每一个进程在屏幕上显示字符说明:父进程显示“Father”,子进...
  • a5987995329
  • a5987995329
  • 2011年12月14日 21:55
  • 5087

lockf()函数

lockf()函数允许将文件区域用作信号量(监视锁),或用于控制对锁定进程的访问(强制模式记录锁定)。试图访问已锁定资源的其他进程将返回错误或进入休眠状态,直到资源解除锁定为止。当关闭文件时,将释放进...
  • Lina_ACM
  • Lina_ACM
  • 2016年05月27日 16:57
  • 310

linux系统编程之文件与I/O(六):fcntl 函数与文件锁

一、fcntl函数 功能:操纵文件描述符,改变已打开的文件的属性 int fcntl(int fd, int cmd, ... /* arg */ ); cmd的取值可以如下: 复制文件描述符...
  • Simba888888
  • Simba888888
  • 2013年05月14日 11:26
  • 11449
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:文件锁fcntl()函数的使用
举报原因:
原因补充:

(最多只允许输入30个字)