【Linux基础】文件夹

来源:互联网 发布:优化游戏画面的软件 编辑:程序博客网 时间:2024/05/21 09:27
文件锁包括建议性锁和强制性锁。建议性锁要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁。强制性锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。采用强制性锁对性能的影响很大,每次读写操作都必须检查是否有锁存在。
在Linux中,实现文件上锁的函数有lockf和fcntl,其中lockf用于对文件施加建议性锁,而fcntl不仅可以施加建议性锁,还可以施加强制锁。同时,fcntl还能对文件的某一记录进行上锁,也就是记录锁。
记录锁又可分为读取锁和写入锁,其中读取锁又称为共享锁,它能够使多个进程都能在文件的同一部分建立读取锁。而写入锁又称为排斥锁,在任何时刻只能有一个进程在文件的某个部分上建立写入锁。当然,在文件的同一部分不能同时建立读取锁和写入锁。

01.jpg (13.57 KB, 下载次数: 0)

下载附件保存到相册设为封面

7 天前 上传

02.jpg (47.34 KB, 下载次数: 0)

下载附件保存到相册设为封面

7 天前 上传

根据cmd参数的不同,fcntl函数有5种功能:
(1) 复制一个现有的描述符(cmd=F_DUPFD)。
(2) 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD)。
(3) 获得/设置文件状态标志(cmd=F_GETFL或F_SETFL)。
(4) 获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)。
(5) 获得/设置记录锁(cmd=F_GETLK、F_SETLK或F_SETLKW)。
cmd参数说明如下。

03.jpg (78.36 KB, 下载次数: 0)

下载附件保存到相册设为封面

7 天前 上传

注意:
fcntl是一个非常通用的函数,它可以改变已打开的文件的性质。fcntl有以上所述的5种功能,在本节中主要介绍第5种功能:获得/设置记录锁。
一般情况下,第三个参数总是一个整数。但是在本节说明记录锁时,第三个参数则是指向一个结构的指针flock。
这里,lock的结构如下所示:
Struct flock
{
short l_type;
off_t l_start;
short l_whence;
off_t l_len;
pid_t l_pid; “”
}
lock 结构中每个变量的取值含义如表 5‑17所示。
5‑17 lock结构体变量取值
参 数
说 明
l_type
F_RDLCK:读取锁(共享锁)
F_WRLCK:写入锁(排斥锁)
F_UNLCK:解锁
l_start
相对位移量(字节)
l_whence
SEEK_SET:文件开头+l_start为新读写位置
SEEK_CUR:目前读写位置+l_start为新读写位置
SEEK_END:文件结尾+l_start为新读写位置
l_len
加锁区域的长度
l_pid
注意:为加锁整个文件,通常是l_start说明为0, l_whence说明为SEEK_SET, l_len说明为0
3.使用实例
程序功能:使用fcntl()设计一个文件上锁子程序。在分别设计两个程序write_lock.c和read_lock.c调用这个上锁子程序。开多个中端同时运行这两个程序,观察结果。
程序说明:
程序代码:
/* lock_set.c */
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_GETLK修改过 */
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;
}/* end of switch */
return 0;
}
下面的实例是文件写入锁的测试用例,这里首先创建一个hello文件,之后对其上写入锁,最后释放写入锁,代码如下所示:
/* write_lock.c */
#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(void)
{
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);
}
接下来的程序是文件读取锁的测试用例,原理和上面的程序一样。
/* read_lock.c */
#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(void)
{
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);
 
本文转载于唯C教育,【Linux基础】文件夹
http://www.weicedu.com/forum.php?mod=viewthread&tid=102&fromuid=4
(出处: http://www.weicedu.com/)
原创粉丝点击