Linux中打开文件时的O_EXCL有什么用

问题描述:

open(pathname, O_RDWR | O_CREAT,0666);就不行吗?为什么好多资料上说要加O_EXCL,说是原子性操作,不加难道就不是了吗?

解答:

如果文件事先已经存在,

open(pathname, O_RDWR | O_CREAT,0666);  打开成功,返回一个大于0的fd

open(pathname, O_RDWR | O_CREAT | O_EXCL,0666); 打开失败,返回-1

O_EXCL表示的是:如果使用O_CREAT时文件存在,就返回错误信息,它可以测试文件是否存在。

设想这样一个需求:某个任务要求只能单个进程执行,不能多个进程同时执行。

但是不能确保多个进程同时启动,尝试执行这个任务。

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

方案之一就是使用带有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时都会成功,然后继续执行。这样就有多个进程同时执行这个任务了。

时间: 2024-11-05 11:36:13

Linux中打开文件时的O_EXCL有什么用的相关文章

linux中对文件的权限设置以及作用

一.通过权限的设置达到目录共享 在linux中通过对文件的权限设置可以充分对文件的 owner进行内容保护,也可以把内容分享给想要分享的用户.下面举例说明:1.首先在root权限下创建一个组,三个用户,将三个用户全部添加到同一组里groupadd gongxiang(创建一个组为gongxiang的组)useradd -G gongxiang zhangsan(创建一个用户zhangsan加入附属组gongxiang)useradd -G gongxiang zhangsi(创建一个用户zhan

Linux中的文件描述符与打开文件之间的关系

1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符.程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误.如果此时去打开一个新的文件,它的文件描述符会是3.POSIX标准要求每次打开文件时(含socket)必须使用当前进程中最小可用的文件描述符号

每天进步一点点——Linux中的文件描述符与打开文件之间的关系

转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符.程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误.如果此时去打开一个

每天进步一点点——Linux中的文件描写叙述符与打开文件之间的关系

转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆能够看成是文件,文件又可分为:普通文件.文件夹文件.链接文件和设备文件.文件描写叙述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引.其是一个非负整数(一般是小整数),用于指代被打开的文件.全部运行I/O操作的系统调用都通过文件描写叙述符.程序刚刚启动的时候.0是标准输入,1是标准输出,2是标准错误. 假设此

Linux centos 下 eclipse 打开文件时关闭

原文地址:http://processors.wiki.ti.com/index.php/Linux_Host_Support#cairo-misc.c:380:_cairo_operator_bounded_by_source:_Assertion_.60NOT_REACHED.27_failed http://processors.wiki.ti.com/index.php/Linux_Host_Support 现象描述:在 centos 系统下,打开eclipse后,打开文件时,eclip

Linux中的文件IO

一.应用框架介绍     1.什么是应用编程 (1)典型的嵌入式产品就是基于嵌入式Linux操作系统来工作的.研发过程:第一步让Linux系统在硬件上跑起来(系统移植工作),第二步基于Linux系统来开发应用程序实现产品功能. (2)基于Linux去做应用编程,其实就是通过调用Linux的系统API来实现应用需要完成的任务. 2.什么是文件的IO 文件的input和output,就是读写文件. 二.文件操作的主要接口API 1.什么是操作系统API (1)API是一些函数,这些函数是有Linux

Linux中删除文件,磁盘空间未释放问题追踪

在客户使用我们产品后,发现一个问题:在删除了文件后,磁盘空间却没有释放.是有进程在打开这个文件,还是其他情况?我们一起来看看一下两个场景 一. 场景一:进程打开此文件 当一个文件正在被一个进程使用时,用户删除此文件,文件只会从目录结构中删除,但并没有从磁盘删除.当使用这个文件的进程结束后,文件才会真正的从磁盘删除,释放占有的空间. 我们发现剩余磁盘空间比较少时,回去删除一些大的临时文件或者log文件,如果删除之后会发现磁盘空间并未减少,那么可以通过"lsof"命令去查看正在使用该文件的

Unix内核中打开文件的表示

Unix内核中已经打开文件,通过三种数据结构表示: 每个进程的进程表中的记录项,包含打开的文件的文件描述符表,与之关联的是: 文件描述符标识 指向一个文件表项的指针 内核为所有打开文件维持一张文件表,每个文件表项代表一个打开文件,包含: 文件状态标识(读.写.添加.同步.非阻塞等 当前文件偏移量 指向该文件v节点表项的指针 3. 每个打开文件都有且只有一个V节点(v-node)结构 文件类型 对此文件进行各种操作的函数的指针 (大多数文件)该文件的i节点(i-node,索引节点) 一个打开的文件

linux中Makefile文件相关内容

第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力.因为,makefile关系到了整个