我正在尝试下面的代码。
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main()
{
int fd;
char filename[10];
printf("enter the file name\n");
scanf("%s",filename);
fd=open(filename,O_RDONLY|O_CREAT|O_TRUNC,S_IRUSR);
if(fd==-1)
{
printf("error opening file\n");
}
else
{
printf("file opened successfully\n");
}
return 0;
}
在这里,我是设置文件的权限,只有用户才能阅读此内容。 当我第一次执行此代码时,它按预期工作。但是它第二次显示错误消息。我怀疑它为什么会给出错误消息,因为我已经设置了与标志模式同步的所需权限模式。
答案 0 :(得分:3)
问题是打开标志的特殊组合。你的意思是:
O_CREAT
)O_TRUNC
)S_IRUSR
)下次当你尝试打开它时,因为它已经存在open
只会尝试截断它。但是,由于您只对该文件具有读取权限,因此截断将失败。
解决此问题的一种简单方法是指定更具包容性的权限,即0700
。
一种简单的诊断方法,通常是一种好的做法,就是在系统调用失败后检查errno
。 (例如,perror
将给出一个人类可读的错误消息。)你会看到调用因EACCES而失败,这被记录为在"O_TRUNC is specified and write permission is denied."时出现。