文件锁的应用

简介: 文件锁的应用

NAME

      fcntl - manipulate file descriptor

SYNOPSIS

      #include <unistd.h>

      #include <fcntl.h>

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

DESCRIPTION

      fcntl()  performs  one  of the operations described below on the open file

      descriptor fd.  The operation is determined by cmd.

 

#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#define FILE_NAME "flock.txt"
int set_lock(const int fd,const int type){
    printf("pid: %d\n",getpid());
    struct flock fflock;
    memset(&fflock ,0,sizeof(struct flock));
    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("read lock is set by %d\n",getpid());
            break;
        case F_UNLCK:
            printf("read lock is set by %d\n",getpid());
            break;
    }
    printf("Process pid =%d out. \n",getpid());
    return 0;
}
int main(void){
    int fd=open(FILE_NAME,O_RDWR|O_CREAT,0666);
    if(fd<0){
  printf("file: %s open failed!!!\n",FILE_NAME);
  exit(-1);
    }
    //lock
    set_lock(fd,F_WRLCK);//对文件上写锁
    getchar();
    //unlock
    set_lock(fd,F_UNLCK);//解锁
    getchar();
    return 0;
}

对上述代码进行参数修改(F_RDLCK,F_WRLCK,F_UNLCK)可观察不同文件锁的权限影响.

结论:当对文件上写锁后,则不可以再对文件写或读.

当对文件上读锁后,则不可以再对文件写,但可以读.

目录
相关文章
|
安全 Java 开发工具
0034Java程序设计-基于Java的飞机大战游戏的设计与实现论文
0034Java程序设计-基于Java的飞机大战游戏的设计与实现论文
126 0
|
Java API C++
Java JNI开发时常用数据类型与C++中数据类型转换
Java JNI开发时常用数据类型与C++中数据类型转换
468 0
|
机器学习/深度学习 C语言 决策智能
【每日一道智力题】之 轮流取石子(尼姆博弈的详解)
【每日一道智力题】之 轮流取石子(尼姆博弈的详解)
761 0
|
算法 数据挖掘 Python
python数据分析 - 数据降维PCA
python数据分析 - 数据降维PCA
191 0
嵌入式开发学习之--点亮LED灯(上)
嵌入式开发学习之--点亮LED灯(上)
嵌入式开发学习之--点亮LED灯(上)
|
存储 算法 程序员
C 非线性结构——树 万字详解(通俗易懂)
C 数据结构与算法入门——树 内容分享。
184 0
|
缓存 运维 物联网
保姆级教程TDengine客户端服务器安装教程
还在一边挠头一边看官方教程?那还不点进来看看,我一步步教你完成安装。绝对的保姆级教程,让安装变得更简单~
3850 1
保姆级教程TDengine客户端服务器安装教程
|
SQL 存储 分布式计算
【Hive】(十七)Hive 优化策略1
【Hive】(十七)Hive 优化策略1
308 0
【Hive】(十七)Hive 优化策略1
|
JSON 资源调度 分布式计算
Yarn管理放置规则
放置规则可以定义在指定应将哪个队列用于提交的作业时考虑的逻辑。这些预定义规则使您可以在提交作业时无需指定队列名称即可提交作业。
474 0
Yarn管理放置规则
|
网络协议 Windows
通用异步 Windows Socket TCP 客户端组件的设计与实现
编写 Windows Socket TCP 客户端其实并不困难,Windows 提供了6种 I/O 通信模型供大家选择。但本座看过很多客户端程序都把 Socket 通信和业务逻辑混在一起,剪不断理还乱。
1136 0