c语言flock不起作用,UNIX C 下flock()函数该怎么用啊。

在包含了头文件的情况下,编译时始终提示没有定义的flock。而且用man k flock 也找不到帮助文档。

|

有三种不同的文件锁,这三种都是“咨询性”的,也就是说它们依靠程序之间的

合作,所以一个项目中的所有程序封锁政策的一致是非常重要的,当你的程序需

要和第三方软件共享文件时应该格外地小心。

有些程序利用诸如 FIlENAME.lock 的文件锁文件,然后简单地测试此类文件是否存在。

这种方法显然不太好,因为当产生文件的进程被杀后,锁文件依然存在,这样文件也许会被永久锁住。

UUCP中把产生文件的进程号PID存入文件,但这样做仍然不保险,因为PID的利用是回收型的。

这里是三个文件锁函数:

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 ;

}

另外,最好参考一下 《Unix环境高级编程》吧,里面有讲的很详细...

|

flock(锁定文件或解除锁定)

相关函数  open,fcntl

表头文件  #include

定义函数  int flock(int fd,int operation);

函数说明  flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。

参数  operation有下列四种情况:

LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。

LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。

LOCK_UN 解除文件锁定状态。

LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。

单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。

返回值  返回0表示成功,若有错误则返回-1,错误代码存于errno。

|

http://blog.csdn.net/ruixj/archive/2006/07/28/993357.aspx

参考上面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值