Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 操作系统 > 其他操作系统 > 如何将Linux包含flock的程序移植到Solaris
【标  题】:如何将Linux包含flock的程序移植到Solaris
【关键字】:Linux,flock,Solaris
【来  源】:http://blog.chinaunix.net/article.php?articleId=25402&blogId=768

如何将Linux包含flock的程序移植到Solaris

Your Ad Here 如何将Linux包含flock的程序移植到Solaris

作者: Badcoffee
Email: blog.oliver@gmail.com
Blog: http://blog.csdn.net/yayong
2005年5月
一个朋友的Linux源程序中包含如下调用:

flock(fd, LOCK_UN)

在Linux上用gcc编译没有问题。但在Solaris上编译时,出错:error: `LOCK_EX' undeclared (first use in this function)

显然,这是因为没有include正确的头文件,导致无法找到LOCK_EX宏的定义所致。

但是,朋友查了solaris的man,确信已经正确的include了头文件,下面是solaris man手册的说明:

man flock

SunOS/BSD Compatibility Library Functions flock(3UCB)

NAME
flock - apply or remove an advisory lock on an open file

SYNOPSIS
/usr/ucb/cc[ flag ... ] file ...
#include sys/file.h

int flock( fd, operation);
int fd, operation;

朋友已经grep了/usr/include/sys/file.h确实没有发现
LOCK_EX宏的定义
难道真的是solaris的头文件出了问题?

从flock(3UCB)可以看出,该调用是属于man手册的section 3的3UCB字类中,
让我们看看3UCB是干什么用的:

man -s 3 intro

.......

(3UCB)
These functions constitute the Source Compatibility
(with BSD functions) library. It is implemented as a
shared object, libucb.so, but is not automatically
linked by the C compilation system. Specify -lucb on
the cc command line to link with this library, which
is located in the /usr/ucb subdirectory. Headers for
this library are located within /usr/ucbinclude. See
libucb(3LIBUCB).

......

问题得到解决,原来3UCB的函数是为兼容BSD函数而保留下来的,
果然按照说明,在/usr/ucbinclude/sys/file.h中找到了这个宏。

通过这么一查,发现section 3里的子类真的很多,以后查man的时候一定要留心。
下面是常用的文件锁函数说明:

flock();
lockf();
fcntl();

flock()是从BSD中衍生出来的,但目前在大多数UNIX系统上都能找到,在单个主
机上flock()简单有效,但它不能在NFS上工作。Perl中也有一个有点让人迷惑的
flock()函数,但却是在perl内部实现的。

fcntl()是唯一的符合POSIX标准的文件锁实现,所以也是唯一可移植的。它也同
时是最强大的文件锁——也是最难用的。在NFS文件系统上,fcntl()请求会被递
交给叫rpc.lockd的守护进程,然后由它负责和主机端的lockd对话,和flock()
不同,fcntl()可以实现记录层上的封锁。

lockf()只是一个简化了的fcntl()文件锁接口。

无论你使用哪一种文件锁,请一定记住在锁生效之前用sync来更新你所有的文件
输入/输出。

lock(fd);
write_to(some_function_of(fd));
flush_output_to(fd); /* 在去锁之前一定要冲洗输出 */
unlock(fd);
do_something_else; /* 也许另外一个进程会更新它 */
lock(fd);
seek(fd, somewhere); /* 因为原来的文件指针已不安全 */
do_something_with(fd);
...
一些有用的fcntl()封锁方法(为了简洁略去错误处理):


#include
#include
read_lock(int fd) /* 整个文件上的一个共享的文件锁 */
{
fcntl(fd, F_SETLKW, file_lock(F_RDLCK, SEEK_SET));
}

write_lock(int fd) /* 整个文件上的一个排外文件锁 */ {
fcntl(fd, F_SETLKW, file_lock(F_WRLCK, SEEK_SET)); }
append_lock(int fd) /* 一个封锁文件结尾的锁,
其他进程可以访问现有内容 */ {
fcntl(fd, F_SETLKW, file_lock(F_WRLCK, SEEK_END));
}

前面所用的file_lock函数如下:

struct flock* file_lock(short type, short whence)
{
static struct flock ret ;
ret.l_type = type ;
ret.l_start = 0 ;
ret.l_whence = whence ;
ret.l_len = 0 ;
ret.l_pid = getpid() ;
return &ret ;
}


而且根据solaris flock(3UCB)的说明,该函数不是线程安全的,因此,强烈建议
用fcntl来取代flock,毕竟它才是POSIX的标准。另外,对于很多大容量邮件系统的
应用,邮箱是通过NFS共享的,更不能用flock来做了。

在Solaris上, 可以使用下面的代码来实现一个新的flock:

#ifndef LOCK_SH
#define LOCK_SH 1 /* shared lock */
#define LOCK_EX 2 /* exclusive lock */
#define LOCK_NB 4 /* don't block when locking */
#define LOCK_UN 8 /* unlock */
#endif
#ifdef POSIX
#include

/*
* This function emulates a subset of flock()
*/
int emul_flock(fd, cmd)
int fd, cmd;
{ struct flock f;

memset(&f, 0, sizeof (f));

if (cmd & LOCK_UN)
f.l_type = F_UNLCK;
if (cmd & LOCK_SH)
f.l_type = F_RDLCK;
if (cmd & LOCK_EX)
f.l_type = F_WRLCK;

return fcntl(fd, (cmd & LOCK_NB) ? F_SETLK : F_SETLKW, &f);
}

#define flock(f,c) emul_flock(f,c)
#endif


利用Veritas对系统盘镜像及反封装:【上一篇】
SA239第13章读书笔记:【下一篇】
【相关文章】
  • 从新学习SOLARIS9系统管理得笔记
  • solaris 9 x86增加一块网卡
  • VNC在solaris下的安裝方法
  • Solaris上的开发环境安装及设置
  • Oracle10g + Solaris9 for x86 + vmware安装步骤
  • Solaris 10_x86 Patch Report
  • solaris DNS客户端设置
  • How to set default route in Solaris - -
  • Configuring NIC Speed/Duplex on Solaris
  • Solaris Networking Files
  • 【随机文章】
  • WinImage密码的另一种破解——WinHex破解法
  • [bingo]模式学习笔记二 Builder
  • 祝贺广州.NET 俱乐部成功加入INETA(国际.NET协会)
  • SQL Server数据库性能的优化
  • Linux学习基础篇
  • 使用ls来查看目录内容
  • 利用剪贴板共享数据
  • linux核心源程序的文件组织
  • jsp常用的指令与标签
  • 自从装上了矮人dos5.0之后,怎样删除argh.目录就成了问题
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.