O_EXCL

open系统调用:

#include <fcntl.h>int open(const char *pathname, int oflag, ... /*mode_t mode */ );其中,oflag有个可选值为:

O_EXCL

Generate an error if O_CREAT is also specified and the file already exists. 

This test for whether the file already exists and the creation of the file if it doesn't exist is an atomic operation. 

We describe atomic operations in more detail in Section 3.11.

译文:当 O_CREAT 与 O_EXCL 同时使用,并且如果要打开的文件已经存在,那么该调用就返回error,表明打开不成功。因此,我们可以使用该方法(即 O_CREAT 与 O_EXCL 同时使用)来实现以下三步的原子性操作:1 检查某个文件是否存在2 如果文件不存在,就创建该文件,返回 success3 如果文件已经存在,就返回error,通知调用者文件已经存在---------------------------------------------华丽丽的分割线-----------------------------------以下是从网上找的一些信息:$ man open
......
  O_EXCL Ensure that this call creates the file: if this flag is specified in conjunc-
  tion with O_CREAT, and pathname already exists, then open() will fail. The
behavior of O_EXCL is undefined if O_CREAT is not specified.=============================================================================================设想这样一个需求:某个任务要求只能单个进程执行,不能多个进程同时执行。
但是不能确保多个进程同时启动,尝试执行这个任务。
这样就进一步要求,只有第一个执行的进程可以继续,后续尝试执行的进程都报错退出。

方案之一就是使用带有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时都会成功,然后继续执行。这样就有多个进程同时执行这个任务了。---------------------------------------------------------------------------------------------------总结下 (O_EXCL|O_CREAT)与 O_CREAT 的区别:1 单独使用 O_CREAT 时,无论文件在该调用执行时,是否存在,都会成功返回(不考虑所在目录权限、文件权限的问题)。如果应用程序只要求确保文件在后续程序执行时,该文件已经存在,则单独使用 O_CREAT 就可满足该应用要求。但有一个不足之处就是:当open成功返回后,我们需要知道该文件是之前已经存在呢,还是之前不存在而刚刚创建出来的。如果有这种需求,那么 单独使用 O_CREAT 就不能搞定了。此时,就需要使用(O_EXCL|O_CREAT)。2 当使用(O_EXCL|O_CREAT)时,若文件已存在,则返回错误;过不存在,则返回成功。但返回不论成功、错误,返回后,文件肯定已经存在了。因此,该方式能够给程序员提供更多的信息量。

区别应该就在这里吧。

那么在apue中,在介绍 Ensure that only one copy of a daemon is running中,作者并没有使用(O_EXCL|O_CREAT)来通过判断某个文件是否存在来判断是否有某个进程的其它实例正在运行。而是采用了O_CREAT,而后加“写锁”的方式。

想想这两种方式的特点:

如果采用 (O_EXCL|O_CREAT)来实现单实例进程,那么进程结束之前,必须要先删除锁文件,否则,以后该程序就无法运行了。因此问题就在如何保证删除锁文件。比如突然断电,程序还没来得及删除锁文件,那么下次再无法运行了。处理好这个问题需要额外画一些功夫。

apue中采用的采用 record lock 的方式,应该是不存在上面提到的这种问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql 解锁被锁定的账号

账号被锁定&#xff0c;在属性那里直接取消lock-out无法解锁。运行这条命令即可&#xff1a;ALTER LOGIN UserLogin WITH PASSWORD NewPassword UNLOCK MUST_CHANGE 转载于:https://www.cnblogs.com/bigshot-z/archive/2010/07/12/1775856.html

ubuntu18分辨率变低,无法调整,最高只有1024*768

方法一 运行xrandr&#xff0c;判断哪个显示器分辨率最大&#xff0c;那个就是真实的显示器 记住是LVDS1还是VGA1这里记住显示的名称 如果是两个&#xff0c;那么恭喜你可以继续设置后 应该就好&#xff0c;只有一个请使用方法二 具体步骤&#xff1a; 下载arandr sudo apt-g…

pp助手苹果版_再见!PP助手iOS端即将下线 曾是中国最大的苹果助手

苹果PP助手即将下线 在今日PP助手官方发布公告&#xff1a;尊敬的PP助手iOS版用户&#xff1a;衷心感谢您多年以来对我们的支持及厚爱。因业务调整&#xff0c;PP助手将于2020年2月28日正式下线iOS版产品&#xff0c;包括PP助手iOS版、PP助手iOS PC版等。 对您造成的不便还望理…

关于规划修编标准的问题

关于规划修编标准的问题 此问题只对规划修编数据库标准&#xff08;报批稿&#xff09;进行的分析!(1)标准的图形表字段和字段的值要可以推导出指标表格&#xff0c;且推导公式明确和正确&#xff1b;(2)地类编码体系要统一&#xff0c;且唯一&#xff0c;要有地类名称和地类代…

【转】Xrandr (简体中文)

转自&#xff1a;Xrandr (简体中文) - ArchWiki "xrandr" 是一款官方的 RandR (Resize and Rotate)维基百科&#xff1a;X 窗口系统 扩展配置工具。它可以设置屏幕显示的大小、方向、镜像等。对多显示器的情况&#xff0c;请参考 Multihead 页面。 Contents 1安装 …

oppo手机工程模式清除数据需要密码_手机隐藏的快捷键都有哪些?

手机从开发出来到现在&#xff0c;已经换了很多代了&#xff0c;从大哥大&#xff0c;小灵通&#xff0c;到诺基亚到山寨机到苹果到华为&#xff0c;几十年过去了。手机从奢侈品一下飞去每个人手里&#xff0c;反正我手机有手机已经快10年了&#xff0c;所以我相信每个人对自己…

关于竖表转横表的问题

本文作者&#xff1a;dinya内容摘要&#xff1a;在开发过程&#xff0c;经常遇到一些将表的显示方式进行转换的需求&#xff0c;我们习惯性称之为竖表到横表的转换&#xff0c;本文通过一个例子来简要说明常见的两种竖表转横表的问题。本文适宜读者范围&#xff1a;oracle初级&…

计算机大小端

大端模式   所谓的大端模式&#xff0c;是指数据的高位&#xff0c;保存在内存的低地址中&#xff0c;而数据的低位&#xff0c;保存在内存的高地址中&#xff0c;这样的存储模式有点儿类似于把数据当作字符串顺序处理&#xff1a;地址由小向大增加&#xff0c;而数据从高位往…

全系光谱完整版

宇宙射线也叫电磁波&#xff0c;其中包含γ射线、X射线、紫外线、可见光、红外线、近红外、远红外&#xff0c;还有无线电和超声波。 无线电波是振荡电路中自由电子作周期性的运动产生的&#xff0e; 红外线、可见光、紫外线是原子外层电子受激发产生的&#xff0e; X射线是原…

cat 几行_迷风花说Cat!Cat因为林教练是好教练回去现实却给了一巴掌

滔博TES前主教练迷风花26日发布了微博&#xff0c;就自己离职、Cat林教练事件以及汤汤纵情转会事件进行了澄清&#xff0c;网友粉丝们在看到教练迷风花发布的微博后&#xff0c;更加了解了很多事情的真相&#xff0c;粉丝们纷纷对教练迷风花送上了祝福&#xff0c;教练迷风花到…

c# equals与==的区别

对于值类型&#xff0c;如果对象的值相等&#xff0c;则相等运算符 () 返回 true&#xff0c;否则返回 false。对于string 以外的引用类型&#xff0c;如果两个对象引用同一个对象&#xff0c;则 返回 true。对于 string 类型&#xff0c; 比较字符串的值。操作比较的是两个变…

linux下C语言中的flock函数用法

表头文件 #include<sys/file.h> 定义函数 int flock(int fd,int operation); 函数说明 flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件&#xff0c;无法锁定文件的某一区域。 参数 operation有下列四种…

c# - C#用fo-dicom对CT图像的PixelData进行处理和转换

转自&#xff1a;c# - C#用fo-dicom对CT图像的PixelData进行处理和转换 - IT工具网 对于某些测试&#xff0c;我试图操纵 PixelData以 dicom 格式存储的 CT 图像的元素&#xff0c;并使用 C# 中的 Fellow Oak Dicom 将其写回文件中。经过一番研究&#xff0c;我发现我想要处理的…

android studio 显示图形_显示服务器实现(一)

在一个多窗口的图形化操作系统中&#xff0c;显示服务器的任务就是组织这些窗口展现给用户。实际的显示服务器有Linux世界基于X11协议的XServer或者Wayland协议的Weston&#xff0c;还有Android里的SurfaceFlinger。但是除了显示&#xff0c;他们同时包含了输入管理&#xff08…

discuzX 帖子 有的图片没输出 [attach]12323[/attach]的解决办法

在pre_forum_post (as p )中&#xff0c;每个帖子都有一个p.attachment字段&#xff0c;这个字段记录了&#xff0c;帖子中有多少张图片&#xff0c;如果为0&#xff0c;则程序不会替换帖子内容(p.message)中的[attach]标签&#xff0c; 在pre_forum_attachment (as a)中&#…

win32 API函数大全

1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束…

如何识别C++编译以后的函数名

C/C语言在编译以后&#xff0c;函数的名字会被编译器修改&#xff0c;改成编译器内部的名字&#xff0c;这个名字会在链接的时候用到。如果用backtrace之类的函数打印堆栈时&#xff0c;显示的就是被编译器修改过的名字&#xff0c;比如说_Z3foov 。 那么这个函数真实的名字是什…

聊聊临时表

什么是临时表临时表与永久表相似&#xff0c;但临时表存储在 tempdb 中&#xff0c;当不再使用时会自动删除。 临时表有两种类型&#xff1a;本地和全局。它们在名称、可见性以 及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头&#xff1b;它们仅对当前的用户连接是…

电脑不能开机维修_MacBook维修 苹果笔记本电脑进水不开机

最近有很多小伙伴来店里&#xff0c;是进水的Macbook苹果笔记本电脑开不开机、黑屏&#xff0c;有很多朋友认为Macbook进水后擦干&#xff0c;只要能开机就没事&#xff0c;实在不开机晾几天就会好了。其实不然。Macbook进水后晾干虽然能开机但有很多后遗症——比如忽然黑屏、反…

Linux Arch目录下处理器体系架构介绍

alpha 处理器 Alpha 处理器最早由美国DEC 公司设计制造&#xff0c;在Compaq &#xff08;康柏&#xff09;公司收购DEC 之后&#xff0c;Alpha 处理器继续得到发展&#xff0c;并且应用于许多高档的Compaq 服务器上&#xff0c;HP &#xff08;惠普&#xff09;收购的Compaq &…