关于open函数O_WRONLY|O_EXCL等标志的返回值与文件存在判断问询
关于open()调用的几个疑问解答
让我一步步帮你理清这些问题:
1. 当文件已存在时,open(filepath, O_WRONLY|O_EXCL)会有返回值吗?
当然会有返回值!不管系统调用成功还是失败,它都会返回一个明确的数值:
- 如果调用失败(文件已存在的情况),会返回 -1,同时系统会把
errno设置为EEXIST(表示文件已存在)。 - 不存在“没有返回值”的情况,哪怕调用失败,内核也会返回这个错误标识的数值。
不过这里要额外提醒:O_EXCL标志单独和O_WRONLY搭配使用时,很多系统会直接忽略O_EXCL(POSIX标准里明确规定,O_EXCL只有和O_CREAT结合时才有效)。也就是说,如果你用O_WRONLY|O_EXCL打开一个已存在的文件,很多情况下调用会成功,直接返回文件描述符,并不会触发失败——这和你预期的“文件存在则失败”可能完全不符。
2. 判断文件是否存在并在存在时打印提示,需要O_EXCL吗?
是的,但必须搭配O_CREAT一起用——也就是你补充提到的open(filepath, O_CREAT|O_EXCL, mode)(这里的mode是文件权限,比如0644)才是正确的姿势。
具体逻辑是:
- 当文件不存在时,
open会成功创建文件,并返回非负的文件描述符。 - 当文件已存在时,
open调用失败,返回-1,errno被设为EEXIST,这时你就可以通过检查这个错误码来打印“文件已存在”的提示信息。
如果不用O_EXCL,只加O_CREAT的话,open会直接打开已存在的文件(按你指定的模式),不会触发失败,也就无法判断文件是否存在。
总结一下
- 所有
open调用都会返回值:成功返回文件描述符(非负整数),失败返回-1。 - 要实现“检查文件存在性,存在则提示”的需求,必须使用
O_CREAT|O_EXCL的组合,单独的O_WRONLY|O_EXCL无法达到目的,因为O_EXCL只有和O_CREAT搭配时才会生效。
内容的提问来源于stack exchange,提问作者Zhe Sheng Lim
相关产品推荐
相关产品推荐

