|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
文件记录锁的功能代码具体如下:
' p( @, P( m) h! J+ f' H3 ?8 N# ~/ g# r% T2 M
, n- o' P2 l i g- A! ^3 Q- /*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;
- }
v4 _" D3 J. @2 w5 M v7 N
' ^) c5 T8 s2 i. w1 f% F
* p' c7 }4 H; X5 x9 P5 H7 V4 `
6 s* O9 L% H8 d, _$ W 下面的代码是文件写入锁的测试用例,这里首先创建一个hello.c文件,然后对其上锁,最后释放写入锁。代码如下所示:- O3 G3 V2 Z7 e: _
& ^% E3 a! i1 M3 g# l
4 S$ o3 x2 ?& z% g+ J
3 B" k, t! ?5 A
- g! a4 \5 }$ D5 ] |
|