写入文件时出现“权限被拒绝”错误,但仅当它尚不存在时才会出错

时间:2012-02-04 13:02:24

标签: c file-io permissions posix system-calls

我一般不喜欢问“我的代码有什么问题”,但这是我最后的希望。

我正在做一个我必须写入文件的项目,我正在尝试使用系统调用(Linux)。我正在使用unistd.h,它提供了以下功能:int open( char* filename, int flags, int mode )int write( int fd, void* ptr, int numbytes )。我一直使用write没有问题,但通常使用标准输出和标准错误文件描述符。

所以我使用这段代码打开文件:

int flags = O_WRONLY;
if( !exists( "testfile2.txt" ) ) {
    flags |= O_CREAT;
}
int mode = S_IROTH | S_IWOTH | S_IXOTH;
int filedesc = open( "testfile2.txt", flags, mode );

然后这一行写入文件:

int written = write(filedesc, "abcdefghijklmnopqrstuvwxyz",
    strlen("abcdefghijklmnopqrstuvwxyz" ) );

最后,我用这个关闭文件:

int closed = close( filedesc );

问题在于,当我尝试写入尚未存在的文件时,我收到一条消息“拒绝许可”。当我在vi中打开它并忽略权限时,该文件似乎为空。但是,如果文件最初存在,它会写入它并且我可以很好地阅读它。有没有人知道出了什么问题,或者我错过了什么?

提前致谢。

2 个答案:

答案 0 :(得分:1)

您正在设置模式以授予他人许可,但不是您自己。只需设置mode = 0777。

答案 1 :(得分:1)

根据docsO_CREAT仅在文件不存在时才使用权限位。您传递007的权限掩码,拒绝“所有者”和“分组”文件的所有权限。在模式标志中至少使用S_IRUSR | S_IWUSR

x@y:~/tmp$ touch test
x@y:~/tmp$ cat test
x@y:~/tmp$ chmod 007 test
x@y:~/tmp$ cat test
cat: test: Permission denied