为什么我锁不住ta ??
- #include<stdio.h>
- #include<errno.h>
- #include<fcntl.h>
- #include<stdlib.h>
- #include<unistd.h>
- #include<sys/file.h>
- int main(int argc,char**argv){
- int fd;
- fd=open("test",O_WRONLY);
- if(fd==-1){
- perror("open");
- exit(1);
- }
- if(flock(fd,LOCK_EX)!=0){
- perror("flock");
- exit(1);
- }
- printf("input any to exit:");
- getchar();
- flock(fd,LOCK_UN);
- close(fd);
- return 0;
- }
复制代码
flock有没有作用的?
我运行这段程序后,在getchar之前,还是可以打开及读写test文件的??
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
本帖最后由 crazyhadoop 于 2011-06-12 13:31 编辑
flock 对fd加锁表示没有别的线程可以再 用这个文件fd编辑文本,你可以再执行一个这个程序,另外的一个就阻塞了。
不知道为什么别的编辑器还可以编辑这个文件,难道编辑的是副本?
本帖最后由 crazyhadoop 于 2011-06-13 00:32 编辑
回复 1# Horizon2012
flock 实现的是建议锁,建议你尝试fcntl对文件上锁~~要上强制锁
你可以多执行几次你这个程序, 然后 less /proc/locks 文件某几行的变化~~
因为你写的这个程序检测了这个文件上没上锁,所以后来执行的程序都被阻塞住了,但是你如果用vim或者其他编辑器来
编辑这个文件,他们并不检测你要打开的文件是否上了锁~ 但是如果上了强制锁,就不能随意编辑了,若是建议锁,就很随意了。
嗯嗯 果真如此
LOCK_SH 是共享锁定/读锁
LOCK_EX 是互斥锁定/写锁
只要有一个进程对文件写锁后,其他进程flock LOCK_EX或者flock LOCK_SH的时候,其他进程都会阻塞
只有当所有的写锁解除LOCK_UN后,flock LOCK_SH的进程才能从阻塞返回
但是要完成上面功能,进程须使用flock来检查锁
如果进程不用flock就无法检查这两种锁定,进程依旧可以打开读写,
相当于进程不使用flock,这两种锁定对该进程没有任何影响/没有强制力