【Linux】Linux文件锁

简介: 【Linux】Linux文件锁

文件锁

前言

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

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

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

    ​ 可修改该文件

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

文件锁

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

用法

#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );

参数

  • cmd——取值F_GETLK,F_SETLK和F_SETLKW,分别表示获取锁、设置锁、和同步设置锁。

struct flock {

short l_type; /F_RDLCK, F_WRLCK, or F_UNLCK /

off_t l_start; /offset in bytes, relative to l_whence /

short l_whence; /SEEK_SET, SEEK_CUR, or SEEK_END /

off_t l_len; /length, in bytes; 0 means lock to EOF /

pid_t l_pid; /returned with F_GETLK /

};

  • 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"

int flock_set(int fd, int type) {
    printf("pid=%d come in.\n",getpid());
    struct flock fflock;
    memset(&fflock, 0, sizeof(fflock));

    fcntl(fd,F_GETLK,&fflock);

    if (fflock.l_type != F_UNLCK) {
        if (fflock.l_type == F_RDLCK) {//有锁,判断是读锁还是写锁
            printf("flock has been set to read lock by %d\n",fflock.l_pid);
        } else if (fflock.l_type == F_WRLCK) {
            printf("flock has been set to write lock by %d\n", fflock.l_pid);
        }
    }

    //锁定文件
    fflock.l_type = type;
    fflock.l_whence = SEEK_SET;
    fflock.l_start = 0;
    fflock.l_len = 0;
    fflock.l_pid = -1;

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

    switch (fflock.l_type) {
    case F_RDLCK:
        printf("read lock is set by %d\n", getpid());
        break;
    case F_WRLCK:
        printf("write lock is set by %d\n", getpid());
        break;
    case F_UNLCK:
        printf("lock is released by %d\n", getpid());
        break;
    default:
        break;
    }

    printf("Process pid = %d out.\n",getpid());
    return 0;

}

int main(void) {
    
    int fd = 0;
    fd = open(FILE_NAME, O_RDWR | O_CREAT, 0666);

    if (fd < 0) {
        printf("open file %s failed!\n",FILE_NAME);
        exit(-1);
    }

    //flock_set(fd, F_RDLCK); //读锁
    flock_set(fd, F_WRLCK);       //写锁
    getchar();
    flock_set(fd, F_UNLCK); //解锁
    getchar();

    close(fd);
    return 0;
}
  • 写锁是排他性的,文件上了写锁,就会阻止其他程序的写锁与读锁
  • 读锁可以多个程序对同一文件上读锁,除此之外其他情况也会失败(阻止其他程序的读锁与写锁)。
相关文章
|
Linux
Linux下面Crontab文件锁实现进程互斥
Linux下面Crontab文件锁实现进程互斥
331 0
Linux下面Crontab文件锁实现进程互斥
|
Unix Linux Perl
Linux 下的文件锁
当进程想要修改文件的时候,申请独占锁(写锁),当进程想要读取文件数据的时候,申请共享锁(读锁)。
540 0
|
人工智能 安全 Linux
Linux 挖矿程序把病毒文件锁住了,删不了,怎么破?(chattr)
本文就讲讲,怎么把这些加了锁的只读文件去 i 取消只读!
|
9月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
979 1
二、Linux文本处理与文件操作核心命令
|
9月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
568 137
|
9月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1506 58
|
8月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
1356 2
|
9月前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
742 16