查看文章
 
6.文件锁
2008年02月13日 星期三 11:09
这个指南主要介绍如何使用libapr(apache portable runtime)。
版权所有,Copyright (C) 2005 INOUE Seiichiro <inoue&ariel-networks.com>,翻译:成彦
原文地址:http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial.html
转载时请保留版权信息。

当我们想要在多个进程间锁一个文件时,可以使用apr_file_lock()函数。过去在Unix系统中,有多个关于文件锁的API函数,混杂不一。因此,libapr提供了apr_file_lock()这样一个简单的API函数,将显示很有用处。
/* 摘自apr_file_io.h */
APR_DECLARE(apr_status_t) apr_file_lock(apr_file_t *thefile, int type);
APR_DECLARE(apr_status_t) apr_file_unlock(apr_file_t *thefile);
apr_file_lock()有两个参数,一个是apr_file_t对象,另一个用来指定锁类型的标志。锁的类型可以是APR_FLOCK_SHARED或是APR_FLOCK_EXCLUSIVE。前者表示可读锁,后者表示可写锁。要对一个文件进行解锁,可以调用apr_file_unlock()函数,或者调用apr_file_close()来隐式地进行解锁。查阅flock_sample.c了解它们的用法。

/**
* apr tutorial sample code
* http://dev.ariel-networks.com/apr/
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include <apr_general.h>
#include <apr_file_io.h>

static apr_status_t do_writelock(const char *fname, apr_pool_t *mp)
{
    apr_status_t rv;
    apr_file_t *fp;
   
    if ((rv = apr_file_open(&fp, fname, APR_WRITE, APR_OS_DEFAULT, mp)) != APR_SUCCESS) {
        return rv;
    }
    rv = apr_file_lock(fp, APR_FLOCK_EXCLUSIVE | APR_FLOCK_NONBLOCK);
    /* if you specify APR_FLOCK_NONBLOCK flag, apr_file_lock() would fail.
     * you should check the return value */
    if (rv != APR_SUCCESS) {
        puts("writable-lock failed");
        goto done;
    }
    printf("%s is writable locked. press any key to unlock\n", fname);
    getchar();

    apr_file_unlock(fp);
done:
    apr_file_close(fp);
    return rv;
}

static apr_status_t do_readlock(const char *fname, apr_pool_t *mp)
{
    apr_status_t rv;
    apr_file_t *fp;

    if ((rv = apr_file_open(&fp, fname, APR_READ, APR_OS_DEFAULT, mp)) != APR_SUCCESS) {
        return rv;
    }
    rv = apr_file_lock(fp, APR_FLOCK_SHARED | APR_FLOCK_NONBLOCK);
    if (rv != APR_SUCCESS) {
        puts("readable-lock failed");
        goto done;
    }

    apr_file_unlock(fp);
done:
    apr_file_close(fp);
    return rv;
}

/**
* file lock sample code
* @remark Error checks omitted
*/
int main(int argc, const char *argv[])
{
    apr_status_t rv;
    apr_pool_t *mp;
    int c;
    const char *fname;
       
    if (argc < 2) {
        printf("usage %s output-filename\n", argv[0]);
        return 0;
    }
    fname = argv[1];

    apr_initialize();
    apr_pool_create(&mp, NULL);

    puts("writable-lock / readable-lock [w/r]?");
    c = getchar();
    if (c == 'w') {
        rv = do_writelock(fname, mp);
    } else if (c == 'r') {
        rv = do_readlock(fname, mp);
    }

    apr_pool_destroy(mp);
    apr_terminate();
    return 0;
}

另外,我们可以使用一个位标志APR_FLOCK_NONBLOCK,没有APR_FLOCK_NONBLOCK标志,调用apr_file_lock()将以阻塞方式运行,带上这个标志后,如果apr_file_lock()函数无法锁文件时,将返回一个错误码APR_EAGAIN。
将apr_file_lock()函数的的返回值与APR_SUCCESS比较,如果相等,则文件被成功的锁定,否则,锁文件失败。

类别:Apache Apr||添加到搜藏 |分享到i贴吧|浏览(304)|评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu