|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
文件记录锁的功能代码具体如下:3 j- J7 a8 R. h2 k
D. P- W9 n% W* x9 D
9 j# ?: g9 y) n# ?# t- /*lock_set.c*/
- int lock_set(int fd,int type)
- {
- struct flock old_lock,lock; /*定义flock结构体*/
- 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 可能在执行完上述判断后被修改了*/
- 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());/*getpid()用来得到当前的进程号*/
- }
- break;
- case F_WRLCK:
- {
- printf("Write lock set by %d\n",getpid());
- }
- break;
- case F_UNLCK:
- {
- printf("Release lock set by %d\n",getpid());
- return 1;
- }
- break;
- default:break;
- } /*end of switch*/
- return 0;
- }
o1 O$ [6 S! U3 }8 \ * K B4 R" T# x* l- U4 i8 |
. `3 A' |" K4 A
$ C2 h& g% s4 w$ D' \; g3 b
下面的代码是文件写入锁的测试用例,这里首先创建一个hello.c文件,然后对其上锁,最后释放写入锁。代码如下所示:3 \9 I$ S9 T# K3 }8 o$ m
4 G) [$ X/ B* d, i9 h
; N3 t) n1 V" f+ ?
5 h* a+ P n) _2 ?. q; C
! }* k4 Q( Y- h5 k |
|