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, 那么程序直接报错,以提醒你更换一个文件名,以避免上述情况的发生.