记录锁

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值