开放系统调用未按预期工作

时间:2015-05-31 12:01:16

标签: c linux posix

我正在尝试下面的代码。

#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;
}

在这里,我是设置文件的权限,只有用户才能阅读此内容。 当我第一次执行此代码时,它按预期工作。但是它第二次显示错误消息。我怀疑它为什么会给出错误消息,因为我已经设置了与标志模式同步的所需权限模式。

1 个答案:

答案 0 :(得分:3)

问题是打开标志的特殊组合。你的意思是:

  • 创建此文件它不存在(O_CREAT
  • 截断它(O_TRUNC
  • 将其权限设置为0400 S_IRUSR

下次当你尝试打开它时,因为它已经存在open只会尝试截断它。但是,由于您只对该文件具有读取权限,因此截断将失败。

解决此问题的一种简单方法是指定更具包容性的权限,即0700

一种简单的诊断方法,通常是一种好的做法,就是在系统调用失败后检查errno。 (例如,perror将给出一个人类可读的错误消息。)你会看到调用因EACCES而失败,这被记录为在"O_TRUNC is specified and write permission is denied."时出现。