Linux C文件锁的操作

  

文件锁的类型

  

& lt; br>

  

1读锁   

<强>共享锁强,如果一进程对文件的某区域加了读锁,B进程也可以在此区域加读锁,但是不能对此区域加写锁。

  

2写锁   

<强>独占锁强,如果一进程对文件的某个区域加了写锁,B进程就不能对此区域加写锁,也不能对此区域加读锁。
& lt; br>
当多个进程同时对一个文件进行读写操作时,为确保文件的完整和一致性,这几个进程要加锁同步。
& lt; br>
当进程开始读取文件的某个区域时,先加读锁,读完之后再解锁。
& lt; br>

  

3文件记录锁

  

文件记录锁
1。它函数原型:int fcntl (int fd, int cmd, struct flck 锁);
参数:fd:文件描述符;
? ? ?cmd:功能符号;(F_SETLK用来设置或释放锁;F_GETLK用来获得锁信息;)
? ? ?锁:存储锁信息的结构体指针;
? ? ?返回值:调用成功返回0,失败返回1
2。锁信息结构体
结构群
{
短l_type;/
锁的类型/
短l_whence;/
偏移量的起始位置:/
off_t l_start;/
从l_whence的偏移量/
off_t l_len;/
从l_start开始的字节数/
pid_t l_pid;/
锁所属进程ID(一般不用)*/
}
& lt; br>
l_type有F_RDLCK读锁,F_WRLCK写锁及F_UNLCK空锁。
(! !注意:读锁,不会影响数据,可以一直加;但是写锁,只能加一次)

  

l_whence有SEEK_SET, SEEK_CUR和SEEK_END。

  

l_len为0时表示从起点开始直至最大可能位置为止。
& lt; br>
下面举个加写锁的例子:

  
 <代码> # include & lt;stdio.h>
  # include & lt;unistd.h>
  # include & lt;fcntl.h>/* *
  fd int fctnl (int, int cmd, struct *锁);//cmd: F_SETLK设置或解放锁;F_GETLK获得锁信息;返回值:0 -成功,1 -失败
  结构体群{
  短l_type;//锁:F_RDLCK F_WRLCK F_UNLCK
  短l_whence;//如何翻译l_start: SEEK_SET SEEK_CUR SEEK_END
  off_t l_start;//起始偏移锁
  off_t l_len;//锁定的字节数
  pid_t l_pid;//PID进程阻塞我们的锁(仅F_GETLK)
  };
  */int main ()
  {
  int fd;
  int res;
  结构体群锁={0};
  
  如果((fd=开放(“a.txt”, O_RDWR))==1)
  {
  fd=(“一个开放。txt”, O_CREAT);
  }
  如果(fd==1)
  {
  printf("文件打开失败! \ n ");
  返回1;
  }//printf (" fd=% d \ n”, fd);//判断是否有锁
  它res=fcntl (fd, F_GETLK和锁);
  如果(res==1)
  {
  perror(“判断有锁失败”);
  返回1;
  }
  如果锁。l_type !=F_UNLCK)
  {
  printf(“失败:文件锁定! \ n”);
  }//其他上写锁,读锁可以一直加,写锁只能加一个
  {
  memset(和锁,0,sizeof (struct群));
  锁。l_whence=SEEK_SET;
  锁。l_start=0;
  锁。l_len=10;
  锁。l_type=F_WRLCK;
  
  它res=fcntl (fd, F_SETLK和锁);
  如果(res==1)
  {
  perror(“上锁失败”);
  返回1;
  }//操作文件
  获取字符();//解锁
  锁。l_type=F_UNLCK;
  它res=fcntl (fd, F_SETLK和锁);
  如果(res==1)
  {
  perror(“解锁失败”);
  返回1;
  }
  }
  
  关闭(fd);
  返回0;
  }
   
  

& lt; br>
关于多个进程上锁的问题,本质上步骤一样,后面复习中陆续再更…

Linux C文件锁的操作