服务器大本营

 找回密码
 我要入营

微信扫码 , 快速开始

QQ登录

只需一步,快速开始

查看: 920|回复: 0

Linux文件锁

[复制链接]

4万

敬重

700

主题

207

精华

管理员

积分
7969

启航之章进阶之印里程之碑突破之证飞跃之星蜕变之勋卓越之路龙年行大运

QQ
发表于 2024-7-8 14:44:34 | 显示全部楼层 |阅读模式

我要入营,结交更多好友,开启更多功能,轻松玩转服务器大本营!

您需要 登录 才可以下载或查看,没有账号?我要入营

x
前言
/proc是一个特殊的文件系统。

该目录下文件用来表示与启动、内核相关的特殊信息。

/proc/cpuinfo——CPU详细信息
/proc/meminfo——内存相关信息
/proc/version——版本信息
/proc/sys/fs/file-max——系统中能同时打开的文件总数

可修改该文件

进程的相关信息——/proc/32689/ 表示指定进程(进程号为32689)的相关信息
/proc/devices——已分配的字符设备、块设备的设备号

文件锁
· 用于并发对文件I/O进行操作

用法
#include <unistd.h>
#include <fcntl.h>

int fcntl(int fd, int cmd, ... / arg / );

参数
· cmd——取值F_GETLK,F_SETLK和F_SETLKW,分别表示获取锁、设置锁、和同步设置锁。
  1. struct flock {
  2. short l_type; /*F_RDLCK, F_WRLCK, or F_UNLCK */
  3. off_t l_start; /*offset in bytes, relative to l_whence */
  4. short l_whence; /*SEEK_SET, SEEK_CUR, or SEEK_END */
  5. off_t l_len; /*length, in bytes; 0 means lock to EOF */
  6. pid_t l_pid; /*returned with F_GETLK */
  7. };
复制代码

· l_type: 第一个成员是加锁的类型:只读锁,读写锁,或是解锁。
· l_start和l_whence: 用来指明加锁部分的开始位置。
· l_len: 是加锁的长度。
· l_pid: 是加锁进程的进程id。

示例
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FILE_NAME "flock_demo.txt"
  1. int flock_set(int fd, int type) {
  2.         printf("pid=%d come in.\n",getpid());
  3.         struct flock fflock;
  4.         memset(&fflock, 0, sizeof(fflock));
  5.         fcntl(fd,F_GETLK,&fflock);
  6.         if (fflock.l_type != F_UNLCK) {
  7.                 if (fflock.l_type == F_RDLCK) {//有锁,判断是读锁还是写锁
  8.                         printf("flock has been set to read lock by %d\n",fflock.l_pid);
  9.                 } else if (fflock.l_type == F_WRLCK) {
  10.                         printf("flock has been set to write lock by %d\n", fflock.l_pid);
  11.                         }
复制代码
  1. //锁定文件
  2.         fflock.l_type = type;
  3.         fflock.l_whence = SEEK_SET;
  4.         fflock.l_start = 0;
  5.         fflock.l_len = 0;
  6.         fflock.l_pid = -1;
复制代码

  1. //阻塞式的        
  2. if (fcntl(fd,F_SETLKW,&fflock) < 0) {
  3.                 printf("set lock failed!\n");
  4.                 return -1;
  5.         }

  6.         switch (fflock.l_type) {
  7.         case F_RDLCK:
  8.                 printf("read lock is set by %d\n", getpid());
  9.                 break;
  10.         case F_WRLCK:
  11.                 printf("write lock is set by %d\n", getpid());
  12.                 break;
  13.         case F_UNLCK:
  14.                 printf("lock is released by %d\n", getpid());
  15.                 break;
  16.         default:
  17.                 break;

  18.         printf("Process pid = %d out.\n",getpid());
  19.         return 0;
  20. int main(void) {
  21.         int fd = 0;
  22.         fd = open(FILE_NAME, O_RDWR | O_CREAT, 0666);

  23.         if (fd < 0) {
  24.                 printf("open file %s failed!\n",FILE_NAME);
  25.                 exit(-1);
  26.       
  27.         //flock_set(fd, F_RDLCK); //读锁
  28.         flock_set(fd, F_WRLCK);
  29.            //写锁
  30.         getchar();
  31.         flock_set(fd, F_UNLCK); //解锁
  32.         getchar();

  33.         close(fd);
  34.         return 0;
复制代码
· 写锁是排他性的,文件上了写锁,就会阻止其他程序的写锁与读锁。
· 读锁可以多个程序对同一文件上读锁,除此之外其他情况也会失败(阻止其他程序的读锁与写锁)。

感谢您的阅读,服务器大本营-技术文章内容集合站,助您成为更专业的服务器管理员!
一入IDC深似海,从此你我是良人!
您需要登录后才可以回帖 登录 | 我要入营

本版积分规则

Loading...

QQ|Archiver|手机版|网站地图|服务器大本营 ( 赣ICP备2021009089号 )

GMT+8, 2024-11-21 17:56 , Processed in 0.085063 second(s), 25 queries , Gzip On.

Powered by 服务器大本营

© 2021-2023 联系飞飞

快速回复 返回顶部 返回列表