使用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和标志位混在一起作为第二个参数传入,会引发两个问题:
0600是八进制数,转换成二进制是110000000,这些位会被当作标志位解析,可能触发了某些你没预期到的异常标志组合;- 未传入第三个参数属于未定义行为,函数无法正确处理“文件不存在则创建”的逻辑,最终导致即使没加
O_EXCL,也会抛出“File exists”的错误。
正确的调用方式应该是:
desc = open(path, O_RDWR | O_CREAT, 0600);
这样函数才能正确执行:以读写模式打开文件,若文件不存在则创建它,新文件的权限设为0600。
内容的提问来源于stack exchange,提问作者Єгорій
相关产品推荐
相关产品推荐

