You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用open()函数未加O_EXCL仍报File exists错误,求原因

文件打开报错“File exists”的原因分析(未使用O_EXCL标志时)

你的代码存在一个关键错误:open函数的参数顺序完全搞反了。

先看你的代码:

desc = open(path, 0600 | O_RDWR | O_CREAT);
if (desc == -1){
    fprintf(stderr, "process %d: open: ", i);
    perror("");
}

open函数的标准原型是:

int open(const char *pathname, int flags, mode_t mode);
  • 第二个参数是标志位(flags),比如O_RDWR、O_CREAT这类控制打开行为的选项;
  • 只有当你使用O_CREAT标志时,才需要传入第三个参数文件权限(mode),也就是你写的0600。

你把权限值0600和标志位混在一起作为第二个参数传入,会引发两个问题:

  1. 0600是八进制数,转换成二进制是110000000,这些位会被当作标志位解析,可能触发了某些你没预期到的异常标志组合;
  2. 未传入第三个参数属于未定义行为,函数无法正确处理“文件不存在则创建”的逻辑,最终导致即使没加O_EXCL,也会抛出“File exists”的错误。

正确的调用方式应该是:

desc = open(path, O_RDWR | O_CREAT, 0600);

这样函数才能正确执行:以读写模式打开文件,若文件不存在则创建它,新文件的权限设为0600。

内容的提问来源于stack exchange,提问作者Єгорій

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:30:45