fcntl函数对文件锁的操作

2024-05-27 02:32
文章标签 函数 操作 fcntl

本文主要是介绍fcntl函数对文件锁的操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Shell下输入man fcntl可获取函数原型

#include <unistd.h>
#include<fcntl.h>
int fcntl( int fd, int cmd , struct flock *lock);
这里,fd表示打开文件的文件描述符
cmd在这里可取F_SETLK 设置或释放锁;F_GETLK 获取锁的属性
struct flock {
    short l_type;
    short l_whence;
    off_t l_start;
    off_t l_len;
    pid_t l_pid;
};
代码如下:

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <fcntl.h>
#include<string.h>
int lock_set(int fd,struct flock *lock)
{
   if (fcntl(fd,F_SETLK,lock)==0)
   { 
      if (lock->l_type==F_RDLCK)
       {
         printf("set read lock,pid:%d\n",getpid());
       }
     else if (lock->l_type==F_WRLCK)
       {
         printf("set wirte lock,pid:%d\n",getpid());
       }
    else if (lock->l_type==F_UNLCK)
       {
         printf("release lock,pid:%d\n",getpid());
       }
   }
   else
   {
      perror("lock operation failed\n");
      return -1;
   }
   return 0;
}
int lock_test(int fd, struct flock *lock)
{
   if (fcntl(fd,F_GETLK,lock)==0)
   {
      if (lock->l_type==F_UNLCK)
      {
         printf("lock can be set in fd\n");
         return 0;
      } 
      else 
      {
         if (lock->l_type==F_RDLCK)
         {
         printf("can't be set,read lock has been set by:%d\n",lock->l_pid);
         } 
         else if (lock->l_type==F_WRLCK)
         {
         printf("can't be set,write lock has been set by:%d\n",lock->l_pid);
         } 
        return -2;
      } 
   }
   else
   {
      perror("get lock failed");
      return -1;
   }
}
int main()
{
   int fd;
    char buf[64]="Hello World!";
     char read_buf[64];
    struct flock lock;
    memset(read_buf,0,64);
   if ((fd=open("lala.c",O_CREAT|O_TRUNC|O_RDWR,S_IRWXU))==-1)
    {
       perror("open fail");
       return 1;
    }
    write(fd,buf,strlen(buf));
     memset(&lock,0,sizeof(struct flock));
     lock.l_start=SEEK_SET;
     lock.l_len=0;
      lock.l_whence=0;
     lock.l_type=F_RDLCK;
     if(lock_test(fd,&lock)==0)
      {
          lock.l_type=F_RDLCK;
          lock_set(fd,&lock);
      }
     close (fd);
    return 0;
}

这篇关于fcntl函数对文件锁的操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1006279

相关文章

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件