/*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;
}