社区
Linux/Unix社区
帖子详情
UNIX C 下flock()函数该怎么用啊。
like_33833006
2009-04-19 09:58:18
在包含了头文件的情况下,编译时始终提示没有定义的flock。而且用man k flock 也找不到帮助文档。
...全文
4746
9
打赏
收藏
UNIX C 下flock()函数该怎么用啊。
在包含了头文件的情况下,编译时始终提示没有定义的flock。而且用man k flock 也找不到帮助文档。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
simplep
2009-11-27
打赏
举报
回复
怎么解决的啊?我也遇到了同样的问题,头文件都包含了,还是报错说没定义
猫已经找不回了
2009-04-19
打赏
举报
回复
楼主你确定包含头文件了,贴来看下。
morris88
2009-04-19
打赏
举报
回复
flock(锁定文件或解除锁定)
相关函数 open,fcntl
表头文件 #include<sys/file.h>
定义函数 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。
morris88
2009-04-19
打赏
举报
回复
有三种不同的文件锁,这三种都是“咨询性”的,也就是说它们依靠程序之间的
合作,所以一个项目中的所有程序封锁政策的一致是非常重要的,当你的程序需
要和第三方软件共享文件时应该格外地小心。
有些程序利用诸如 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 <fcntl.h>;
#include <unistd.h>;
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环境高级编程》吧,里面有讲的很详细...
小y正在思考人生
2009-04-19
打赏
举报
回复
又是这么诡异
morris88
2009-04-19
打赏
举报
回复
把代码贴出来看看,貌似很奇怪...
顺便问一句,你的系统环境?
like_33833006
2009-04-19
打赏
举报
回复
#include <unistd.h>;
#include <sys/file.h>
可以确定这二个头文件是有的。
子晞
2009-04-19
打赏
举报
回复
http://blog.csdn.net/ruixj/archive/2006/07/28/993357.aspx
参考上面
子晞
2009-04-19
打赏
举报
回复
man 2 flock
perl
函数
手册(英文版)
perl
函数
手册英文版 Perl提供了可以直接调用的、数目众多的
函数
。可以对以下对象进行操作: 数组:chomp, join, keys, map, pop, push, reverse, shift, sort, splice, split, unshift, values 数据库:dbmclose, ...
Perl 实例精解(第三版).pdf
9.1.7 使用f
lock
锁住文件 9.1.8 seek和tell
函数
9.1.9 打开文件读写 9.1.10 管道打开 9.2 传送参数 9.2.1 ARGV数组 9.2.2 ARGV和Null文件句柄 9.2.3 eof
函数
9.2.4 -i开关:原位编辑文件 ...
对Python多线程读写文件加锁的实例详解
对于文件锁的操作,主要需要使用 fcntl.f
lock
(fd, operation)这个
函数
。 其中,参数 fd 表示文件描述符;参数 operation 指定要进行的锁操作,该参数的取值有如下几种:
LOCK
_SH:表示要创建一个共享锁,在任意时间...
网络安全ppt(1).pptx
缓冲区溢出 原理 边界检查 堆栈 网络服务请求 对策 安全编程知识 使用代码的质量 安全的编译器和
函数
库和代码检查工具 网络安全ppt(1)全文共65页,当前为第20页。 口令破解 口令的处理方法
UNIX
Windows系统 98的....
网络安全ppt(2).pptx
缓冲区溢出 原理 边界检查 堆栈 网络服务请求 对策 安全编程知识 使用代码的质量 安全的编译器和
函数
库和代码检查工具 网络安全ppt(2)全文共65页,当前为第20页。 口令破解 口令的处理方法
UNIX
Windows系统 98的....
Linux/Unix社区
23,121
社区成员
74,508
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章