日期:2014-05-16  浏览次数:21119 次

O_EXCL到底有什么用?
目的:试图open一个文件,若文件不存在就创建它。
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打开一个已经存在的文件,返回-1,errno是17
EEXIST 17 /* File exists */

------解决方案--------------------
$ 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.
------解决方案--------------------
学一个API的时候应该多考虑一下他的应用场景.
这个O_EXCL就是一个表现了一个专属的语义. 确保创建一个文件的时候没有其它的同名文件,这样做有什么好处? 比如应用程序1依赖于并读写文件A, 而你写的程序2创建并依赖A, 那么程序2就干扰了程序1. 如果你创建文件的时候加O_EXCL, 那么程序直接报错,以提醒你更换一个文件名,以避免上述情况的发生. 

探讨
引用:

如果文件事先已经存在,
open(pathname, O_RDWR | O_CREAT,0666); 打开成功,返回一个大于0的fd
open(pathname, O_RDWR | O_CREAT | O_EXCL,0666); 打开失败,返回-1
楼主可以自己写几行代码验证一下。

说的是,但目的是“试图open一个文件,若文件不存在就……