【问题标题】:Open returns (-1) with O_CREAT when file already exists当文件已经存在时,打开返回 (-1) 并带有 O_CREAT
【发布时间】:2016-07-02 17:23:46
【问题描述】:

该函数将一个无符号整数数组保存在一个文件中。我希望它覆盖现有文件或创建它。如果文件不存在,则正确填写。如果它已经存在,它会保持原样:但我希望它被覆盖。这就是我使用“O_CREAT”的原因。

int save_pic(t_bunny_pixelarray *pix, const char *filename, t_tekpaint *tekpaint) {
    unsigned int *pixels;
    int FD;
    int i = 0;
    if (!filename)
        return 1;
    if ((FD = open(filename, O_WRONLY | O_CREAT, S_IRUSR)) == -1)
        return 1;
    return 0;
}

(我写在最后一个return 1return 0之间)。

如果我执行以下操作:

if ((FD = open(filename, O_WRONLY | O_CREAT, S_IRUSR)) == -1) {
    printf("error\n");                                                            
    return 1;
}

如果文件存在则打印错误,如果文件不存在则不打印错误。 我尝试将S_IRUSR 更改为其他可能的值,因为我认为该进程可能对文件无权或其他什么,但它并没有改变任何东西。

这就像我使用O_EXCL 一样,我显然没有。 一定是一件愚蠢的事情。 谢谢。

【问题讨论】:

  • errnoopen 失败后有什么内容?
  • @lurker " EEXIST 路径名已经存在,并且使用了 O_CREAT 和 O_EXCL。"我不使用 O_EXCL。
  • @melpomene 现在要去检查,总是忘记这样做。
  • @melpomene ENAMETOOLONG... 之前在我的程序中做了一些愚蠢的事情。谢谢你,该死的我-.-
  • @melpomene 嘿,有没有办法可以关闭这个话题并验证你的评论?

标签: c system-calls


【解决方案1】:

S_IRUSR 表示为用户读取(因此没有写入权限)。

第一次运行程序创建权限为-r--------的文件
第二次运行失败并显示 EPERM (Permission denied)。

您应该指定写入权限:

open(filename, O_WRONLY | O_CREAT, S_IWUSR)

或使用默认的 umask :

open(filename, O_WRONLY | O_CREAT)

【讨论】:

  • 这是真的,但不是问题所在。仍然 +1 原因完全相关,在这种情况下很有用。
猜你喜欢
  • 2018-02-03
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多