|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
文件记录锁的功能代码具体如下:
% ]* a' Z* V0 k6 \# D1 G8 s. t/ k- H" d7 X8 a
9 G* G4 V+ D2 J, E) n- m% y2 C- /*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;
- }! m3 p4 C' Q7 B# E; q
, W% \: t- z5 f, p H. m& X% B* L$ z, l8 o- ^; m" [
; p7 a6 ], j: B5 K; V" E' n 下面的代码是文件写入锁的测试用例,这里首先创建一个hello.c文件,然后对其上锁,最后释放写入锁。代码如下所示:
8 K$ z1 K6 K3 R% n
1 m2 Y5 q/ e' x) @/ F3 f9 ]" T; L) w- O, A5 g
3 k( a9 @6 V' b' Q6 ^* m- E, W$ j; z% ]' H; x, @- c" I
|
|