/*write_lock.c*/
/*
**首先给flock结构体的对应位赋值,两次调用fcntl()函数,分别用于判断是否可以上锁,和给
相关文件上锁。
*/
/*lock_set.c*/
#include<unistd.h>
#include<sys/file.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
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_GETCLK修改过*/
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 bu %d\n",getpid());
}
break;
case F_UNLCK:
{
printf("Release lock set bu %d\n",getpid());
return 1;
}
break;
default:
break;
}
return 0;
}
int main(void)
{
int fd;
/*首先打开文件*/
fd=open("hello",O_RDWR | O_CREAT,0664);
if(fd<0)
{
printf("Open file error\n");
exit(1);
}
/*给文件上写入锁*/
lock_set(fd,F_WRLCK);
getchar();
/*给文件解锁*/
lock_set(fd,F_UNLCK);
getchar();
close(fd);
exit(0);
}