Chinaunix首页 | 论坛 | 博客
  • 博客访问: 279396
  • 博文数量: 109
  • 博客积分: 2116
  • 博客等级: 大尉
  • 技术积分: 1062
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-22 15:38
文章分类

全部博文(109)

文章存档

2013年(2)

2011年(16)

2010年(90)

2009年(1)

我的朋友

分类: LINUX

2010-07-09 11:09:52

今天完成一个文件锁的实验。

文件锁用来解决文件共享的问题。

文件锁分为读取锁和写入锁。读取锁为共享锁,写入锁为排斥锁。

LINUX中实现锁函数有lockffcntl。后者应用广泛,本实验也是基于后者。

源代码来自华清远见。

写入锁代码:

#include

#include

#include

#include

#include

#include

 

//文件记录锁的功能代码

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

        }

    }

    lock.l_type=type;//可能已近被修改

    if((fcntl(fd, F_SETLKW, &lock))<0)

    {

        printf("lock failed:type=%d\n",lock.l_type);

        return 1;

    }

       //根据不同TYPE进行上锁

    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;

}

 

int main(void)

{

    int fd;

    fd=open("hello",O_RDWR|O_CREAT, 0644);//打开HELLO文件

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

}

执行结果:

端口1

端口2

今天继续完成锁的实验。

为文件读取锁部分。

实验源代码来自华清远见。

读取锁代码:

#include

#include

#include

#include

#include

#include

 

//文件记录锁的功能代码

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

        }

    }

    lock.l_type=type;//可能已近被修改

    if((fcntl(fd, F_SETLKW, &lock))<0)

    {

        printf("lock failed:type=%d\n",lock.l_type);

        return 1;

    }

       //根据不同TYPE进行上锁

    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;

}

 

int main(void)

{

    int fd;

    fd=open("hello",O_RDWR|O_CREAT, 0644);//打开HELLO文件

    if(fd<0)

    {

        printf("open file error\n");

        exit(1);

    }

 

    lock_set(fd, F_RDLCK);//写入锁

    getchar();

 

    lock_set(fd, F_UNLCK);//解锁

    getchar();

    close(fd);

    实验结果:

端口1

端口2

 

注:

同上次实验相对比,很容易从结果看出:写入锁为互斥锁,同一时刻只能有一个存在。

读取锁为共享锁。

阅读(545) | 评论(0) | 转发(0) |
0

上一篇:复用

下一篇:文件读写上锁

给主人留下些什么吧!~~