我一般不喜欢问“我的代码有什么问题”,但这是我最后的希望。
我正在做一个我必须写入文件的项目,我正在尝试使用系统调用(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中打开它并忽略权限时,该文件似乎为空。但是,如果文件最初存在,它会写入它并且我可以很好地阅读它。有没有人知道出了什么问题,或者我错过了什么?
提前致谢。
答案 0 :(得分:1)
您正在设置模式以授予他人许可,但不是您自己。只需设置mode = 0777。
答案 1 :(得分:1)
根据docs,O_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