社区
Linux/Unix社区
帖子详情
UNIX C 下flock()函数该怎么用啊。
like_33833006
2009-04-19 09:58:18
在包含了头文件的情况下,编译时始终提示没有定义的flock。而且用man k flock 也找不到帮助文档。
...全文
4790
9
打赏
收藏
UNIX C 下flock()函数该怎么用啊。
在包含了头文件的情况下,编译时始终提示没有定义的flock。而且用man k flock 也找不到帮助文档。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
f
lock
.tar_Windows编程_
在Windows编程领域,`f
lock
()`
函数
通常与
Unix
/Linux系统中的文件锁定机制相关,但在Windows环境下,这种功能并不原生支持。不过,由于跨平台开发的需求,开发者有时会在Windows上模拟这种行为。本文将深入探讨如何在...
extern()和 f
lock
()
函数
- 当
函数
在 *.c 文件中定义,而在其他 *.c 文件中需要调用时,可以使用 `extern` 来声明该
函数
。 - 例如: ```c // function.c void my_function(); // main.c #include "function.h" extern void my_...
Linux下的文件IO、标准IO
函数
的调用、其他文件IO
函数
f
lock
函数
用于控制文件的共享锁定和排他锁定;splice
函数
是另一种无需数据拷贝的文件传输方式,它通过管道在两个文件描述符之间传输数据。 在实际应用中,标准IO和文件IO
函数
需要结合使用,才能发挥各自的优势。...
unix
编程常见问题解答.pdf
- 在
Unix
中,可以使用`getenv()`
函数
获取环境变量,该
函数
接收环境变量名称作为参数,并返回相应的值。若想设置环境变量,可以使用`setenv()`
函数
,它接受三个参数:环境变量名、新值以及是否替换旧值的标志。 - **...
PHP使用f
lock
实现文件加锁的方法
f
lock
()是基于底层操作系统的文件锁机制实现的,它在大多数
Unix
系统上使用fcntl()
函数
,在Windows系统上使用
Lock
FileEx()
函数
。 f
lock
()
函数
的基本语法是:f
lock
(file,
lock
,b
lock
),其中: - file参数是必需的,它...
Linux/Unix社区
23,217
社区成员
74,540
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章