LinuxC、打开一个存在的文件,EEXIST错误bug
Linux C, opening a file that exists, EEXIST error bug
使用此代码,我不确定为什么在调用 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);
}
S_IRWXU
是 模式 的一部分,而不是 标志 :
int flags = O_WRONLY | O_CREAT | O_APPEND;
int mode = S_IRWXU;
int fd = open("./atomic.txt", flags, mode);
最有可能发生的事情是 S_IRWXU
正在设置 flags
的 O_EXCL
位,因此如果文件已经存在,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
标志都是0200
.
使用此代码,我不确定为什么在调用 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);
}
S_IRWXU
是 模式 的一部分,而不是 标志 :
int flags = O_WRONLY | O_CREAT | O_APPEND;
int mode = S_IRWXU;
int fd = open("./atomic.txt", flags, mode);
最有可能发生的事情是 S_IRWXU
正在设置 flags
的 O_EXCL
位,因此如果文件已经存在,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
标志都是0200
.