当前位置: 技术问答>linux和unix
O_EXCL到底有什么用?
来源: 互联网 发布时间:2017-03-31
本文导语: 目的:试图open一个文件,若文件不存在就创建它。 open(pathname, O_RDWR | O_CREAT,0666);就不行吗?为什么好多资料上说要加O_EXCL,说是原子性操作,不加难道就不是了吗?不解 | 如果文件事先已...
目的:试图open一个文件,若文件不存在就创建它。
open(pathname, O_RDWR | O_CREAT,0666);就不行吗?为什么好多资料上说要加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
楼主可以自己写几行代码验证一下。
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 */
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.
......
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, 那么程序直接报错,以提醒你更换一个文件名,以避免上述情况的发生.
这个O_EXCL就是一个表现了一个专属的语义. 确保创建一个文件的时候没有其它的同名文件,这样做有什么好处? 比如应用程序1依赖于并读写文件A, 而你写的程序2创建并依赖A, 那么程序2就干扰了程序1. 如果你创建文件的时候加O_EXCL, 那么程序直接报错,以提醒你更换一个文件名,以避免上述情况的发生.
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。