open函数中参数选项O_EXCL解析

Linux内核源码分析--打开块设备文件--open_bdev_excl函数 本文主要参考《深入理解Linux内核》,结合2.6.11.1版的内核代码,分析内核文件子系统中的打开设备文件函数,梳理了关于内核块设备文件打开的处理流程。 注意: 1、不描述内核同步、错误处理相关的内容 2、参考信息除具体说明外,包含在《深入理解Linux内核》第三版中 3、源码摘自Linux内核2.6.11.1版 1、open_bdev_excl 函数功能: 打开设备名为path的 阅读详情

带O_EXCL参数选项的差别:

第一种:

int fd = open(PATH, O_RDWR | O_CREAT, 0666);

当PATH存在时,函数返回值fd为该文件描述符,不存在则创建,函数返回值fd也为该文件描述符;

--------------- --------------------------------------------------------------------------------------------------------------------

第二种:

int fd2 = open(PATH, O_RDWR | O_CREAT | O_EXCL, 666);

if( fd2 < 0)

{

    printf("this file is exist!\n";);
    fd2 = open(PATH, O_RDWR);

}

当PATH存在时,函数返回值fd为-1(相当于出错),不存在则创建,函数返回值fd为该文件描述符;用于说明该文件是原来存在的还是此时open创建的。我们可通过添加判断执行if的printf语句提示文件事先存在,并非此语句此时创建,然后执行您要的操作,比如可以继续再执行open语句以得到该文件描述符。两者区别在于文件不存在时,再创建后,您想要的继续执行方式!若没有要求原子操作,可先用access函数来判断文件是否存在配合第一种方式open相对会好理解点,但如果需要原子操作,比如如下摘抄的例子:

设想这样一个需求:某个任务要求只能单个进程执行,不能多个进程同时执行。但是不能确保多个进程同时启动,尝试执行这个任务。

这样就进一步要求,只有第一个执行的进程可以继续,后续尝试执行的进程都报错退出。

方案之一就是使用带有O_EXCL标志的open()尝试打开一个文件。

第一个进程执行时文件并不存在,它能成功创建文件并继续执行。

第二个及后续的其它进程会因为文件已存在,从而open()失败,进程退出。如果不使用O_EXCL标志,那你的代码可能要这样写:

if( access(file, R_OK) == -1 )/* 首先检查文件是否存在 */

open(file, O_RDWR | O_CREAT,0666); /* 如果不存在,那我创建一个这样的文件 */

.../* 继续执行任务 */

这个逻辑是有潜在的问题的,那就是判断文件是否存在与创建文件是两个独立的系统调用。

如果进程1执行access,判断出文件并不存在;然后由于操作系统的调度策略,进程1暂停执行,进程2执行,进程2也会判断出文件不存在。

最终结果就是:两个进程调用open时都会成功,然后继续执行。这样就有多个进程同时执行这个任务了.



以上纯属学习笔记



        
open/close函数的使用 1.open函数的使用调用open函数可以打开或创建一个文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, 阅读详情

相关推荐

【SerDes】美信GMSL2-CSI调试心得

美信GMSL2加解串器芯片家族广泛应用于车载和工业视觉系统。文章介绍了MAX96717/MAX96717F加串器和MAX96724/MAX96724R解串器的关键特性,包括支持MIPI CSI-2接口、6Gbps传输速率等功能。提供了基于高通平台的demo系统配置和调试步骤,重点阐述了Link Lock、PCLK检测和Video Lock等关键调试环节,并详细说明了像素模式,隧道模式的工作原理及寄存器配置示例。文中还包含通过I2C读写寄存器的具体操作指令,取流freeze可能原因和解决方法。

qq_38089448的博客 2498

O_EXCL的作用

O_EXCL的作用 设想这样一个需求:某个任务要求只能单个进程执行,不能多个进程同时执行。 但是不能确保多个进程同时启动,尝试执行这个任务。 这样就进一步要求,只有第一个执行的进程可以继续,后续尝试执行的进程都报错退出。 方案之一就是使用带有O_EXCL标志的open

7275

在Ubuntu 22.04上从零搭建FVCOM环境:手把手搞定Linux、Intel编译器与NetCDF库

本文详细指导在Ubuntu 22.04上从零搭建FVCOM环境,涵盖Linux系统配置、Intel编译器安装、NetCDF库编译及常见问题解决。通过手把手教程,帮助科研人员高效完成水动力数值模拟环境的部署,特别适合水环境研究领域的初学者。

weixin_30613727的博客 651

O_EXCL

在open的时候常会使用O_CREAT|

ccskyer的专栏 7921

基于ESP32-S3与PCM5102的HiFi网络收音机复刻指南:从硬件设计到软件配置

本文提供了一份详细的基于ESP32-S3与PCM5102的HiFi网络收音机复刻指南。内容涵盖从核心硬件选型(如ESP32-S3主控与PCM5102 DAC芯片)、四路独立LDO供电设计,到软件环境配置、固件烧录及常见问题调试的全过程,旨在帮助创客打造一台支持网络电台、本地播放与蓝牙连接的高保真音频播放器。

weixin_30632267的博客 188

奈曼-皮尔逊准则

奈曼-皮尔逊准则 如果各个假设的先验概率P(Hi)(i=0,1)P(H_i)(i=0,1)P(Hi​)(i=0,1)已知,并且每种判决的代价函数已知,这时,可以用贝叶斯准则进行判决。 如果进一步假设正确判决不付出的代价,而错误判决代价相同,即c00=c11=0,c01=c10=1c_{00}=c_{11}=0,c_{01}=c_{10}=1c00​=c11​=0,c01​=c10​=1,这时可以用最小平均错误概率准则进行判决。 在不知道先验概率P(Hi)(i=0,1)P(H_i)(i=0,1)P(Hi​)(

little_soldier的专栏 1万+

open() O_EXCL 参数讲解

open() O_EXCL 参数讲解 fd = open(filename, O_RDWR | O_CREAT | O_EXCL, 0600); O_EXCL一般和O_CREAT同时出现, 意思是如果filename不存在, 则新建之. 如果已经存在, 则打开文件失败: fd < 0. O_EXCL If O_CREAT and O_EXCL are set, open() shall f...

liuhhaiffeng的专栏 1697

如何在 FPGA 中做数学运算

FPGA 非常适合进行数学运算,但是需要一点技巧,所以我们今天就看看如何在 FPGA 中进行简单和复杂的数学运算。介绍由于FPGA可以对算法进行并行化,所以FPGA 非常适合在可编程逻辑中实现数学运算。我们可以在 FPGA 中使用数学来实现信号处理、仪器仪表、图像处理和控制算法等一系列应用。这意味着 FPGA 可用于从自动驾驶汽车图像处理到雷达和飞机飞行控制系统的一系列应用。因为 FPGA 寄存器...

OpenFPGA的博客 2919

关于open操作的O_EXCL的存在应用价值理解

在我最近学习Linux C的过程中  总是看到这样的打开方式   open(const* pathname,O_CREAT|O_EXCL); O_CREAT  简单  就是想打开的文件如果不存在的话就会自动创建文件 而  O_EXCL   他的作用就是如果要创建一个文件   并且这个文件已经存在的话   会直接返回     并且  如果打开的文件是符号链接文件的话  也会直接返回

Key的博客 1237

MATLAB算法实战应用案例精讲-【数模应用】装箱问题

装箱问题可以根据不同的维度进行分类。以下是一些常见的装箱问题二维装箱问题:二维装箱问题假设所有物品都是平面上的矩形,并且需要将它们放入平面上的容器中。这个问题的目标是找到一种装箱方案,使得物品不重叠并占据的总面积最小。三维装箱问题:三维装箱问题考虑到物品可以具有高度,并且需要将它们放入三维容器(如箱子或货柜)中。目标是找到一种装箱方案,使得物品不重叠且总体积最小。多维装箱问题:多维装箱问题是指在更高维度空间中进行装箱的问题。除了长度和宽度之外,物品可能具有其他属性,如高度、重量、形状等。

qq_36130719的博客 1572

ComfyUI整合包、秋叶ComfyUI、Florence节点报错下载并加载Florence2模型No module named ‘timm.layers‘、ComfyUI报错解决

步骤操作1打开2地址栏输入cmd并回车3输入命令:4安装完成后重新打开 ComfyUI,执行工作流,即可解决报错。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1244

O_CREAT O_EXCL O_APPEND O_TRUNC

🔺举例:在O_CREAT后跟上O_EXCL,如果已经有file1文件,就提示文件存在;如果没有file1文件,什么也不显示,并创建新的文件。:打开文件时,如果文件中本来是有内容的,而且为只读或只写打开成功,则将其长度截短为0(如果有新写入的内容,就将原内容覆盖掉)。🔺举例:在打开文件file1时,若文件不存在,就需要使用O_CREAT创建文件file1,在跟上文件访问权限mode。:若文件不存在则创建文件,🔺使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限。

m0_74985965的博客 3265

GNN(图神经网络)的 MATLAB 仿真

图神经网络(Graph Neural Network, GNN)是一种用于处理图结构数据的深度学习模型。GNN 通过聚合节点及其邻居的信息,能够有效捕捉图结构中的复杂关系,广泛应用于社交网络分析、推荐系统、化学分子分析等领域。GNN 通过消息传递机制聚合节点及其邻居的信息,能够有效处理图结构数据。MATLAB 仿真展示了 GNN 的基本流程和节点分类性能,适用于社交网络分析、推荐系统、化学分子分析和知识图谱等多种应用场景。

走向CTO的路上... 837

3.3 文件I/O_open函数

#include int open(const char *pathname, int oftag, ...);返回值:成功返回文件描述符,出错返回-1    调用open函数可以打开或创建一个文件。我们将第三个参数写为...,ISO C用这种方法表明余下参数的数量及其类型根据具体的调用会有所不同。对于open函数而言,仅当创建新文件时才使用第三个参数。    pathname是要打开或创建文件的名字。    oflag参数可用来说明此函数的多个选项。用下列一个或多个常量进行“或”运算构成oflag参数(这

cxf100900的专栏 507

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Linux 文件IO学习之open函数深入了解

萌新0.1

m0_61167558的博客 9935

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

open()函数各选项详解

#include int open(const char *pathname,int oflag,..../*mode_t mode*/) 返回值:成功则返回文件描述符,若出错则返回-1 调用open函数可以打开或创建一个文件。第三个参数写为...,对open...

feng574912883的专栏 554

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

open函数的O_CREAT与O_EXCL

O_CREAT与O_EXCL

飞信天下专栏 2428

linux文件I/O之 open() 函数用法

linux open() 函数用于打开或创建一个文件,函数原型为:int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 其中:pathname:路径名。flags:位掩码,用于指定文件的打开模式。mode:位掩码,用于当调用 open() 函数创建新文件时,指定文件的访问权限。

天道酬勤 1067

open函数的使用

简述:open是UNIX系统(包括LINUX、Mac等)的系统调用函数,区别于C语言库函数fopen。 #include<fcntl.h> #include<unistd.h> int open(constchar*pathname,intflags); int open(constchar*pathname,intflags,mode_t mode); 返回值:成功则返...

kayshi的博客 1万+

文件描述符fd,open函数

1.参数fd(open函数的返回值),是要关闭的文件描述符。当一个进程终止时,内核对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。但是,作为一个合格的程序员,还是要手动关闭,因为在程序运行时间特别长的情况下,会浪费这个fd资源。 2.由open返回的文件描述符一定是该进程尚未使用的最小描述符。

weixin_38011893的博客 2360

Linux文件之open函数打开/创建

一、open函数: 1.函数包含头文件: #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> 2.函数原型: int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 3.函数参数: ① pathna

weixin_49840285的博客 2289

C语言 打开文件open函数

头文件: #include &lt;sys/types.h&gt; #include &lt;sys/stat.h&gt; #include &lt;fcntl.h&gt; 定义函数: int open(const char * pathname, int flags); int open(const char * pathname, int flags, mode_t mode); ...

weixin_43667308的博客 3061

Linux系统函数open部分使用规则

作用:使用open()打开或创建文件,为后面对文件进行操作做准备。 ubuntu所在目录:usr/include/fcntl.h 在<fcntl.h>里声明 extern int open (const char *__file, int __oflag, …); 参数解析: 一、第一个参数filename:指定路径的文件名字 二、第二个参数flags:对打开或创建的文件的操作权限 1...

weixin_43971252的博客 1430

31.Linux open函数的flag详解

1.open函数的flag详解1 1.1读写权限:O_RDONLY O_WRONLY O_RDWR (1)linux中文件有读写权限,我们在打开文件时也可以附带一定的权限说明(比如O_RDONLY就表示以只读方式打开,O_WRONLY表示以只写方式打开,O_RDWR表示以可读可写方式打开) (2)当我们附带了权限后,打开文件就只能按照这种权限来操作 #include <stdio.h> #include <string.h> #include <sys/ty...

m0_57908316的博客 2023

Linux 应用层开发入门(九)| Open函数深度解析

本文深入解析Linux系统调用open()函数。作为系统IO的起点,open()不仅打开文件返回文件描述符,还在内核中完成inode查找、进程关联和权限设置等关键操作。文章详细剖析open()的两种原型、参数(pathname、flags、mode)及其组合使用场景,特别分析了O_CREAT、O_EXCL等标志位的功能。通过示例程序展示了open()的错误处理机制和文件描述符本质,强调fd是进程访问内核文件资源的索引。文章指出open()是Linux"一切皆文件"设计理念的核心体现,正确

嵌入式小程同学的博客 1653
上一篇: Linux socket receive file
下一篇: Eclipse快捷键
iHunks
博客等级 码龄18年 5粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值