fcntl(文件锁)

2023-12-10 20:08
文章标签 fcntl

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

fcntl(文件锁)
表头文件  #include <unistd.h>
          #include <fcntl.h>
函数定义 int fcntl(int fd, int cmd, struct flock *lock);
函数说明 fd:文件描述符
设置的文件描述符,参数cmd代表欲操作的指令
F_DUPFD 
复制参数fd的文件描述符,执行成功则返回新复制的文件描述符,
F_GETFD 
取得close-on-exec标志,若些标志的FD_CLOEXEC位为0,代表在调用
exec()相关函数时文件将不会关闭
F_SETFD 设置close-on-exec标志,该标志以参数arg的 FD_CLOEXEC位决定
F_GETFL 得到open()设置的标志
F_SETFL 改变open()设置的标志
F_GETLK 取得文件锁定的状态,根据lock的描述,决定是否上文件锁
F_SETLK 设置文件锁定的状态,此时flcok,结构的l_tpye值必须是F_RDLCK、F_WRLCK或F_UNLCK,
如果无法建立锁定,则返回-1
F_SETLKW 是F_SETLK的阻塞版本,在无法获取锁时会进入睡眠状态,如果可以获取锁或者捕获到信号则返回
参数lock指针为flock结构指针定义如下
 struct flock {
             ...
             short l_type;    /* Type of lock: F_RDLCK,锁定的状态
                                 F_WRLCK, F_UNLCK */
             short l_whence;  /* How to interpret l_start:决定l_statr位置
                                 SEEK_SET, SEEK_CUR, SEEK_END */
             off_t l_start;   /* Starting offset for lock */锁定区域的开关位置
             off_t l_len;     /* Number of bytes to lock */锁定区域的大小
             pid_t l_pid;     /* PID of process blocking our lock
                                 (F_GETLK only) */锁定动作的进程
             ...
         };
1_type有三种状态:
F_RDLCK读取锁(共享锁)
F_WRLCK写入锁(排斥锁)
F_UNLCK解锁
l_whence也有三种方式
SEEK_SET以文件开头为锁定的起始位置
SEEK_CUR以目前文件读写位置为锁定的起始位置
SEEK_END以文件尾为锁定的起始位置
返回值 成功则返回0,若有错误则返回-1
l_len:加锁区的长度
l_pid:具有阻塞当前进程的锁,其持有进程的进程号存放在l_pid中,由F_GETLK返回
通常是将l_start设置为0,l_whence设置为SEEK_SET,l_len设置为0
---------------------------------------------------------------------------------------------
lock_set.c
----------------------------------------------------------------------------------------------
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
int lock_set(int fd,int type)
{
 struct flock lock;
 lock.l_whence=SEEK_SET;
 lock.l_start=0;
 lock.l_len=0;
 lock.l_type=type;
 lock.l_pid=-1;
 fcntl(fd,F_GETLK,&lock);//get the fd and lock status
 if(lock.l_type!=F_UNLCK)
 {
  if(lock.l_type==F_RDLCK)
  {
   printf("Read lock already set by %d/n",lock.l_pid);
  }
  else if(lock.l_type==F_WRLCK)
  {
   printf("Write lock already set by %d/n",lock.l_pid);
  }
 }
 lock.l_type=type;//F_GETLK maybe chmod the lock.l_type type
 if(fcntl(fd,F_SETLKW,&lock)<0)//set lock
 {
  printf("Lock failed:type=%d/n",lock.l_type);
  return 1;
 }
 switch(lock.l_type)
 {
  case F_RDLCK:
  {
   printf("Read lock set by %d/n",getpid());
   
  }
  break;
  case F_WRLCK:
  {
   printf("Write lock set by %d/n",getpid());
  }
  break;
  case F_UNLCK:
  {
   printf("Release lock by %d/n",getpid());
  }
  break;
  default:
  break;
 }
 return 0;
}
--------------------------------------------------------------------------------------------
test_write_read_lock.c
-------------------------------------------------------------------------------------------
#include<unistd.h>
#include<sys/file.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h>
#include"lock_set.c"
char buf[]="shui xian bin you are best!";
char s[100]="";
int main(void)
{
 int fd;
 fd=open("t.txt",O_RDWR|O_CREAT|O_APPEND,0777);
 if(fd<0)
 {
  perror("open");
  exit(1);
 }
 lock_set(fd,F_WRLCK);
 write(fd,buf,sizeof(buf));
 lock_set(fd,F_UNLCK);
 close(fd);
 fd=open("t.txt",O_RDWR,0777);
 if(fd<0)
 {
  perror("open");
  exit(1);
 }
 lock_set(fd,F_RDLCK);
 read(fd,s,sizeof(s));
 lock_set(fd,F_UNLCK);
 printf("read ...%s/n",s);
 close(fd);
 exit(0);
}
----------------------------------------------------------------------------------------
[root@localhost test]# ./s
Write lock set by 6224
Release lock by 6224
Read lock set by 6224
Release lock by 6224
read ...shui xian bin you are best!
-----------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

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



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

相关文章

Linux函数fcntl/system学习

本文针对项目中用到的几个函数进行详细分析,并尽可能的添加示例进行验证学习。比如fcntl/ioctl函数、system/exec函数、popen/pclose函数、mmap函数等。 重点参考了《UNP》和《Linux程序设计》第四版。 一、fcntl函数 fcntl函数可以改变或者查看已打开文件的性质。该函数的定义如下: #include <fcntl.h> int fcntl(

flock和fcntl的区别

原文出处:http://www.jb51.net/article/90255.htm 首先flock和fcntl是系统调用,而lockf是库函数。lockf实际上是fcntl的封装,所以lockf和fcntl的底层实现是一样的,对文件加锁的效果也是一样的。后面分析不同点时大多数情况是将fcntl和lockf放在一起的。下面首先看每个函数的使用,从使用的方式和效果来看各个函数的区别。  1. f

linux 系统调用fcntl详解

文件控制函数          fcntl -- file control LIBRARY          Standard C Library (libc, -lc) SYNOPSIS          #include ;          int fcntl(int fd, int cmd, ...); [描述]             Fcnt

(P7-P8)文件与IO:文件共享、dup、fcntl

文章目录 1.文件共享2.复制文件描述符 1.文件共享 打开文件内核数据结构 (1)内核中如何表示打开的文件的? 每个进程都有1个文件描述符表; refcnt表示文件当前的引用计数; stat状态返回的信息都保存在v节点信息上面; i节点信息保存了文件存放在磁盘的哪个位置; 一个进程两次打开同一个文件 一个进程两次打开同一个文件,V节点信息是共享的; 文件状态标志是不一样

Linux C 编程 —— fcntl、ioctl和stat区别

1、 fcntl #include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd, ... /* arg */ ); fcntl函数可以改变某进程中一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞等标志(这些标志称为File Status Flag),而不必重新open文件。 通过fcntl设置的都是当前进程如何访问设备

Linux文件I/O的lseek,fcntl和ioctl函数

lseek函数 每个打开的文件都记录着当前读写位置,打开文件时读写位置是0,表示文件开头,通常读写多少个字节就会将读写位置往后移多少个字节。但是有一个例外,如果以O_APPEND方式打开,每次写操作都会在文件末尾追加数据,然后将读写位置移到新的文件末尾。lseek和标准I/O库的fseek函数类似,可以移动当前读写位置(或者叫偏移量)。 #include <sys/types.h>#incl

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 f

Linux网络编程--文件属性fcntl函数

/*使用fcntl控制文件符*/#include <unistd.h>#include <fcntl.h>#include <stdio.h>int main(void){int flags = -1;int accmode = -1;/*获得标准输入的状态的状态*/flags = fcntl(0, F_GETFL, 0);if( flags < 0 ){/*错误发生*/printf(

使用fcntl函数将套接字设为非阻塞式I/O

在socket编程中需要设置套接字为非阻塞时,可以使用fcntl函数设置。 函数原型: #incude <fcntl.h> int  fcntl(int fd, int cmd, ... /*int arg*/); 实现代码如下: int flags;if( (flags = fcntl(fd, F_GETFL, 0)) < 0 ){perror(F_GETFL error);exi

Linux系统编程之fcntl使用

功能描述:根据文件描述词来操作文件的特性。 #include <unistd.h> #include <fcntl.h>  int fcntl(int fd, int cmd);  int fcntl(int fd, int cmd, long arg);  int fcntl(int fd, int cmd, struct flock *lock); [描述] fcntl()针对(文件)