Linux文件编程常用函数详解——fcntl()函数

2023-10-27

fcntl()函数:

#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
int fcntl(int filedes, int cmd,.../* int arg * / ) ;
返回:若成功则依赖于cmd(见下),若出错为- 1

常见用法:

1.复制一个文件描述符;
2.获取或者设置文件状态标志;
3.获得、设置文件记录锁;

struct flock 结构体定义:

struct flock {
	short l_type;  /* 记录锁类型,F_RDLCK,F_WRLCK或F_UNLCK */
	off_t l_start;  /* 起始位置偏移量,单位字节,是相对于l_whence而言 */
	short l_whence; /* SEEK_SET,SEEK_CUR,或SEEK_END */
	off_t l_len; /* 长度,单位字节,值为0时表示一直到文件尾 */
	pid_t l_pid; /* 使用F_GETLK时返回此值 */
}

获得/设置记录锁(cmd = F_GETLK , F_SETLK或F_SETLKW)

F_GETLK是获得上锁的状态,F_SETLK是非阻塞上锁,F_SETLKW是阻塞上锁。

实例代码

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include <errno.h>
#include <string.h>

int main(){
	/*fcntl函数可以复制文件符
	int fd1, opt, fd2;
	opt = 1;

	fd1 = open("a.txt", O_WRONLY);
	fd2 = fcntl(fd1,  F_DUPFD, opt); // fd2等价于fd1(复制文件符),且f2 >= opt

	write(fd1, "ccc", 3);
	write(fd2, "ddd", 3);

	close(fd1);
	close(fd2);*/



	/*用fcntl函数给打开的文件添加属性
	int fd, flag;
	char *p = "hello";
	char *q = "world";

	//打开文件
	fd = open("a.txt", O_WRONLY);
	if(fd == -1){
		perror("open");
		exit(1);
	}

	//从头开始写入,覆盖旧的内容
	if(write(fd, p, strlen(p)) == -1){
		perror("write");
		exit(1);
	}

	//用fcntl函数获取文件标志
	flag = fcntl(fd, F_GETFL, 0);
	if(flag == -1){
		perror("F_GETFL");
		exit(1);
	}

	//添加O_APPEND,追加写属性
	flag |= O_APPEND;

	//将新的状态字赋予文件
	if(fcntl(fd, F_SETFL, flag) == -1){
		perror("F_SETFL");
		exit(1);
	}

	//从文件末尾写入,不会覆盖旧的内容
	if(write(fd, q, strlen(q)) == -1){
		perror("write again");
		exit(1);
	}

	close(fd);
	*/



	int fd;
	fd = open("a.txt", O_RDWR);
	struct flock lck;
	lck.l_type = F_WRLCK;//设置写锁
	lck.l_start = 0;//起始位置偏移量,相对于whence而言
	lck.l_whence = SEEK_SET;//从头开始偏移
	lck.l_len = 0;//值为0时表示一直到文件尾都被锁住

	printf("start wrlock.....\n");
	fcntl(fd, F_SETLKW, &lck);//F_SETLKW是表示尝试上锁会阻塞
	printf("wrlock successfully\n");
	getchar();
	lck.l_type = F_UNLCK;//解锁
	fcntl(fd, F_SETLKW, &lck);
	printf("w unlock\n");
	close(fd); 
} 
//O_ACCMODE是宏定义的0x11,用来获取读写权限
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux文件编程常用函数详解——fcntl()函数 的相关文章

  • linux connect 设置连接超时【转】

    原来我们实现connect 超时基本上都使用unix网络编程一书的非阻塞方式 connect nonb 今天在网上看到一篇文章 觉得很有意思 转载如下 读Linux内核源码的时候偶然发现其connect的超时参数竟然和用SO SNDTIMO
  • Linux下gdb编译调试程序

    Linux下gdb编译调试程序 前言 一 调试前的准备 二 gdb中断点的使用 三 gdb中运行调试程序 四 gdb中打印值和监控值 总结 参考 前言 本文记录调试工具gdb的一些基础使用方式 gdb是一个程序调试工具 注意 如果是程序语法
  • Unix环境编程中的apue.h和err_quit、err_sys问题

    现在开始学习 Unix环境编程 这本书 在学习的时候总会遇到书中的程序编译时会出现问题 所以自己将遇到的问题及解决的方法进行总结 找不到头文件apue h和err qiut err sys 1 apue h是作者自定义的一个头文件 并不是U
  • gdb调试正在运行的进程

    http elisawell blog 163 com blog static 171462881201223061149953 有时会遇到一种很特殊的调试需求 对当前正在运行的其它进程进行调试 正是我今天遇到的情形 这种情况有可能发生在那
  • brk(), sbrk() 用法详解

    http blog csdn net ssjhust123 article details 7772153 brk sbrk 的声明如下 cpp view plain copy include
  • cd命令、pwd命令和环境变量PWD、OLDPWD的关联

    1 cd命令 cd命令这里不多介绍 cd 命令是返回上次所在的目录 2 PWD和OLDPWD环境变量 dai ubuntu env PWD home dai OLDPWD dai ubuntu 3 关联 1 当你输入 cd 命令返回上次的目
  • 使用Crash工具分析 Linux dump文件

    前言 Linux 内核 以下简称内核 是一个不与特定进程相关的功能集合 内核的代码很难轻易的在调试器中执行和跟踪 开发者认为 内核如果发生了错误 就不应该继续运 行 因此内核发生错误时 它的行为通常被设定为系统崩溃 机器重启 基于动态存储器
  • linux glob函数man页与实例

    Linux Programmer s Manual NAME glob globfree find pathnames matching a pattern free memory from glob SYNOPSIS include
  • Linux多进程:orphan process——孤儿进程

    孤儿进程orphan process 当父进程比子进程先结束 这样的子进程就成为了孤儿进程 每当出现一个孤儿进程 内核会把孤儿进程的父进程设置为init 托管 init进程会循环wait 孤儿进程结束 然后做剩下的善后 回收资源 因此 孤儿
  • 解决/lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found

    原因 编译时用的gcc等系统环境和运行时的环境不同 比如gcc版本不一样 以及其他的运行库版本不同等 方法 官方下载需要的版本库 之后软连接到运行系统上 wget http ftp de debian org debian pool mai
  • Linux中主线程和子线程的终止次序

    Linux中pthread是我们进行多线程并发时经常使用的 pthread创建的子线程和主线程的终止顺序有什么样的关系 下面通过代码来总结下 在代码测试前 先说下结论 1 主线程和子线程之间没有必然的退出次序关系 主线程退出 子线程可以继续
  • CentOS 7升级gcc/CentOS 7 yum 安装gcc

    centos7自带的gcc版本是4 8 手动升级安装很锻炼 毕竟已经0202年了 devtoolset 7 Developer Toolset is designed for developers working on CentOS or
  • linux查看、添加、删除环境变量

    阅读目录 一 Linux 环境变量介绍 1 1 Linux 环境变量介绍 1 2 Linux 环境变量分类 1 3 Linux 常用的环境变量 二 Linux 查看环境变量 三 Linux 添加环境变量 3 1 添加系统级环境变量 需roo
  • Linux文件编程常用函数详解——exit()和_exit()函数

    两个函数的区别
  • 音视频大牛雷霄骅

    https blog csdn net leixiaohua1020 https www zhihu com question 49211380 https www bilibili com video av9927626 share so
  • popen 使用方法

    popen 可以执行shell命令 并读取此命令的返回值 popen 函数通过创建一个管道 调用fork 产生一个子进程 执行一个shell以运行命令来开启一个进程 可以通过这个管道执行标准输入输出操作 这个管道必须由pclose 函数关闭
  • 如何快速确定程序的入口

    前言 在阅读代码时 知道程序的入口十分重要 这有助于快速理清程序的逻辑框架 我们找到程序入口后 顺着代码的执行顺序来阅读代码 可以比较容易的理解代码 这里说的代码是编译后成为可执行程序的代码 在linux中就是elf格式 被编译成可执行程序
  • TCP/IP编程实现远程文件传输

    TCP IP编程实现远程文件传输 在TCP IP网络结构中 为了保证网络安全 网络人员往往需要在路由器上添加防火墙 禁止非法用户用ftp等安全危害较大的TCP IP协议访问主机 而有时系统维护人员需要用ftp将一些文件从中心机房主机传到前端
  • [Ubuntu]GTest安装和测试

    1 Ubuntu直接通过控制台安装 sudo apt get install libgtest dev 2 编译链接库 2 1进入gtest文件夹 cd usr src gtest 2 2编译 没有安装Cmake的请先安装cmake sud
  • read和write函数

    read ssize t read int fd void buf size t count fd 文件描述符 通过open获得 buf 需要读取的数据的存放位置 数组的地址 count 指定数组的大小 返回值 成功 gt 0 返回实际读取

随机推荐

  • 业务场景——热点数据

    热点数据解决思路 识别热点 1 在代码层面做预热识别 比如给某个接口判断入参是否为热点数据的规则 比如redis过期时间1s 调一次 1但不更新过期时间 若增长量 gt 5则判为热数据 这种方法能更快速的识别热数据 但缺点是业务逻辑复杂 且
  • MySQL实现7天,15天,30天,90天用户留存数量查询

    如何计算用户留存率 新增用户留存率 新增用户中登录用户数 新增用户数 100 一般统计周期为天 新增用户数 在某个时间段 一般为第一整天 新登录应用的用户数 登录用户数 登录应用后至当前时间 至少登录过一次的用户数 第N日留存 指的是新增用
  • 标准BP神经网络以及MATLAB实现

    BP神经网络的结构可分成三部分 输入层 输入数据 隐藏层 处理数据 输出层 输出结果 其过程可以分为正向传播过程和反向传播过程 在正向传播过程中 BP神经网络通过隐层神经元对数据进行处理 从而输出相应结果 在反向传播过程中BP神经网络通过对
  • 第十七节 DRM 图形显示框架

    以往我们在Linux 上为显示设备开发驱动时 通常使用的是FrameBuffer 的驱动框架 在Frame Buffer 驱动框架下 我们能够快速开发出可供简单使用的显示驱动 但是随着芯片显示外设的性能逐渐增强及GPU 的引入 FrameB
  • linux前台,后台命令

    https promotion aliyun com ntms yunparter invite html userCode qqwovx6h top命令按内存和cpu排序 目录 按进程的CPU使用率排序 按进程的内存使用率排序 按进程的C
  • 有关spring security的错误之 AccessDeniedException Access is denied

    AccessDeniedException Access is denied 没有访问权限 解决方法有以下几种 1 form表单对应spring security的配置文件一定一样 spring security的配置文件代替了contro
  • UE4大数据可视化教程(1)——通过osm和shp数据批量生成城市和道路模型

    目录 通过OSM数据生成这个世界上的任意区域模型 配合blender插件生成批量城市和道路模型
  • c++ stl erase_C ++ STL中的set :: erase()函数

    c stl erase C STL set erase 函数 C STL set erase function set erase function is a predefined function it is used to erase
  • Oracle VM VirtualBox 创建和使用 Ubuntu

    一 下载安装 VirtualBox 安装过程此处不做说明 二 新建虚拟机 打开VirtualBox 点击新建图标新建虚拟机 设置名称 文件保存路径和镜像文件 配置用户名和密码 用于账号登录 分配内存和CPU内核数 这边使用默认值 ubunt
  • mysqldump --master-data=2 --single-transaction

    1 mysqldump导出数据主要有两种控制 一种是导出的全过程都加锁 lock all tables 另一种则是不加 前者会在导出开始时执行 FLUSH TABLES WITH READ LOCK 也就是加全局读锁 会阻塞其它写操作 以保
  • Qt5 报错笔记

    使用QSound类 步骤 1 pro文件中加入 QT multimedia 2 窗体 h文件中加入QSound类的指针 QSound sound 私有对象 3 窗体 cpp文件中构造函数进行音乐播放 QString runPath QCor
  • 为什么ping淘宝返回的ip地址无法直接访问

    为什么ping淘宝返回的ip地址无法直接访问 今天在进行子域名查询的时候想要使用淘宝ip结果发现查询出来的淘宝ip居然显示 难受 于是上网上搜索研究发现原因如下 淘宝采用了CDN服务 当用户访问网站时 域名解析到距离用户最近的CDN服务器的
  • CET,UTC,GMT,CST几种常见时间概述与关系

    CET UTC GMT CST几种常见时间概述与关系 作者 菌果果 日期 2011年03月15日 发表评论 6 查看评论 CET 欧洲中部时间 英語 Central European Time CET 是比世界标准时间 UTC 早一个小时的
  • Linux命令:pidof

    pidof命令 查询某个指定服务进程的PID值 每个进程的进程号码 PID 是唯一的 因此可以通过PID来区分不同的进程 执行以下命令查询sudo服务的PID root LAPTOP HJMUH10E home simon pidof su
  • JVM-从熟悉到精通

    JVM 机器语言 一个指令由操作码和操作数组成 方法调用等于一个压栈的过程 栈有 BP寄存器 和 SP寄存器来占用空间 BP gt Base Point 栈基址 栈底 SP gt Stack Point 栈顶 字节序用于规定数据在内存单元如
  • CUDA并行算法系列之FFT快速卷积

    CUDA并行算法系列之FFT快速卷积 卷积定义 在维基百科上 卷积定义为 离散卷积定义为 0 1 2 3 和 0 1 2 的卷积例子如下图所示 Python实现 直接卷积 根据离散卷积的定义 用Python实现 def conv a b N
  • RNN, LSTM, GRU模型结构详解(看这一篇就够了)

    RNN和LSTM讲解超详细的文章 https zhuanlan zhihu com p 32085405 GRU超详解文章 https zhuanlan zhihu com p 32481747
  • jupyter notebook 导出 markdown文件格式

    jupyter notebook 导出 markdown文件格式 原本jupyter notebook 里面自带的可以选择导出为markdown格式 但是下载之后文件总是打不开 只能另寻他法 方法 第一步 安装nbconvert pip i
  • C++类和对象的基本概念

    目录 1 c和c 中struct的区别 2 类的封装 3 类的访问权限 1 c和c 中struct的区别 c语言中结构体中不能存放函数 也就是数据 属性 和行为 方 法 是分离的 c 中结构体中是可以存放函数的 也就是数据 属性 和行为 方
  • Linux文件编程常用函数详解——fcntl()函数

    fcntl 函数 include