Linux C,打开一个存在的文件,EEXIST错误bug

时间:2017-10-15 00:56:40

标签: c linux io errno

使用此代码后,我不确定为什么在调用open()后出现错误(EEXIST 17文件存在)。该文件确实存在。

int flags = O_WRONLY | O_CREAT | O_APPEND | S_IRWXU;
int fd = open("./atomic.txt", flags);

if(fd==-1)
{
    printf("error code: %d \n", errno);
    perror("open.. ");
    exit(0);
}

1 个答案:

答案 0 :(得分:5)

S_IRWXU模式的一部分,而不是标志

int flags = O_WRONLY | O_CREAT | O_APPEND;
int mode = S_IRWXU;
int fd = open("./atomic.txt", flags, mode);

最有可能发生的事情是S_IRWXU设置O_EXCL的{​​{1}}位,因此flags如果文件已经存在则会失败。那是确实的情况,至少在我的系统上是这样的:

open()

您可以看到/usr/include/fcntl.h: #define S_IRWXU (__S_IREAD|__S_IWRITE|__S_IEXEC) /usr/include/x86_64-linux-gnu/bits/stat.h: #define __S_IREAD 0400 #define __S_IWRITE 0200 #define __S_IEXEC 0100 /usr/include/asm-generic/fcntl.h: #define O_EXCL 00000200 模式和__S_IWRITE标记均为O_EXCL