Linux文件锁基本概念及其实例(2)

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);
  }     
 }
 
 lock.l_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 by %d\n",getpid());
  }
  break;
  case F_UNLCK:
  {
   printf("Release lock by %d\n",getpid());
   return 1;
  }
  break;
 
  default:
  break;

}
 return 0;
}

下面的实例是文件写入锁的测试用例,文件名为,linuxidc.wirte_lock.c 。

这里首先创建了一个hello 文件,之后对其上写入锁,最后释放写入锁,代码如下所示:

#include<stdio.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include "linuxidc.c"
int main(void)

 int fd;/* 首先打开文件*/
 fd = open("hello",O_RDWR | O_CREAT, 0644);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);   
 return 0;
}

运行截图如下:

Linux文件锁基本概念及其实例

在PC机上测试:
开启两个终端,并且在两个终端上同时运行该程序,以达到多个进程操作一个文件的效果。
首先在终端1运行,然后在终端2上运行,注意终端二中的第一行输出。

Linux文件锁基本概念及其实例

由此可见,写入锁为互斥锁,同一时刻只能有一个写入锁存在。

接下来的程序是文件读取锁的测试用例,原理和上面的程序一样。文件名为linuxidc.read_lock.c。

#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include "linuxidc.c"
int main(void)
{
 int fd;fd = open("hello",O_RDWR | O_CREAT, 0644);if(fd < 0)
 { 
  printf("Open file error\n");
  exit(1); 
 }
 lock_set(fd, F_RDLCK); /* 给文件上读取锁*/
 getchar();
 lock_set(fd, F_UNLCK); /* 给文件解锁*/
 getchar();
 close(fd);
 exit(0);   
 return 0;
}

运行结果如下:

Linux文件锁基本概念及其实例

同样开启两个终端,并首先启动终端一上的程序,其运行结果如下所示:

Linux文件锁基本概念及其实例

观察可知,读锁是共享锁。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/30bdbb3e6350168037fa7a343875e812.html