linux下的简单文件读写锁的操作

来源:互联网 发布:ubuntu安装中文字体 编辑:程序博客网 时间:2024/05/16 04:32
设置文件锁
/* lock_set.c */int lock_set(int fd, int type){struct flock old_lock, lock;lock.l_whence = SEEK_SET;lock.l_start = 0;lock.l_len = 0;lock.l_type = type;lock.l_pid = -1;/* 判断文件是否可以上锁 */fcntl(fd, F_GETLK, &lock);if (lock.l_type != F_UNLCK){/* 判断文件不能上锁的原因 */if (lock.l_type == F_RDLCK) /* 该文件已有读取锁 */{printf("Read lock already set by %d\n", lock.l_pid);}else if (lock.l_type == F_WRLCK) /* 该文件已有写入锁 */{printf("Write lock already set by %d\n", lock.l_pid);}}/* l_type 可能已被F_GETLK修改过 */lock.l_type = type;/* 根据不同的type值进行阻塞式上锁或解锁 */if ((fcntl(fd, F_SETLKW, &lock)) < 0){printf("Lock failed:type = %d\n", lock.l_type);return 1;}switch(lock.l_type){case F_RDLCK:{printf("Read lock set by %d\n", getpid());}break;case F_WRLCK:{printf("Write lock set by %d\n", getpid());}break;case F_UNLCK:{printf("Release lock by %d\n", getpid());return 1;}break;default:break;}/* end of switch  */return 0;}
</pre><pre code_snippet_id="1699361" snippet_file_name="blog_20160527_4_9985044" name="code" class="cpp">读文件锁
/* read_lock.c */#include <unistd.h>#include <sys/file.h>#include <sys/types.h>#include <sys/stat.h>#include <stdio.h>#include <stdlib.h>#include "lock_set.c"int main(void){<span style="white-space:pre"></span>int fd;<span style="white-space:pre"></span><span style="white-space:pre"></span>fd = open("hello",O_RDWR | O_CREAT, 0644);<span style="white-space:pre"></span>if(fd < 0)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>printf("Open file error\n");<span style="white-space:pre"></span>exit(1);<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>/* 给文件上读取锁 */<span style="white-space:pre"></span>lock_set(fd, F_RDLCK);<span style="white-space:pre"></span>getchar();<span style="white-space:pre"></span><span style="white-space:pre"></span>/* 给文件解锁 */<span style="white-space:pre"></span>lock_set(fd, F_UNLCK);<span style="white-space:pre"></span>getchar();<span style="white-space:pre"></span><span style="white-space:pre"></span>close(fd);<span style="white-space:pre"></span>exit(0);}
写文件锁
/* write_lock.c */#include <unistd.h>#include <sys/file.h>#include <sys/types.h>#include <sys/stat.h>#include <stdio.h>#include <stdlib.h>#include "lock_set.c"int main(void){<span style="white-space:pre"></span>int fd;<span style="white-space:pre"></span><span style="white-space:pre"></span>/* 首先打开文件 */<span style="white-space:pre"></span>fd = open("hello",O_RDWR | O_CREAT, 0644);<span style="white-space:pre"></span>if(fd < 0)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>printf("Open file error\n");<span style="white-space:pre"></span>exit(1);<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>/* 给文件上写入锁 */<span style="white-space:pre"></span>lock_set(fd, F_WRLCK);<span style="white-space:pre"></span>getchar();<span style="white-space:pre"></span><span style="white-space:pre"></span>/* 给文件解锁 */<span style="white-space:pre"></span>lock_set(fd, F_UNLCK);<span style="white-space:pre"></span>getchar();<span style="white-space:pre"></span><span style="white-space:pre"></span>close(fd);<span style="white-space:pre"></span><span style="white-space:pre"></span>exit(0);}
</pre><pre code_snippet_id="1699361" snippet_file_name="blog_20160527_9_7172336" name="code" class="cpp">执行的效果如下
<img src="http://img.blog.csdn.net/20160527211734192?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
执行的读文件锁 此时的文件锁已被锁住了
<img src="http://img.blog.csdn.net/20160527211801333?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
</pre><pre code_snippet_id="1699361" snippet_file_name="blog_20160527_15_3072871" name="code" class="cpp">
                                             
0 0
原创粉丝点击