当文件已存在时,使用O_CREAT打开返回(-1)

时间:2016-07-02 17:23:46

标签: c system-calls

该函数将unsigned int数组保存在文件中。我希望它覆盖现有文件或创建它。如果文件不存在,则会正确填充。如果它已经存在,它仍然保持原样:但我希望它被覆盖。这就是我使用' 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一样,我显然不会这样做。 必须是一个愚蠢的事情。 谢谢。

1 个答案:

答案 0 :(得分:1)

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

第一次运行程序创建具有权限-r--------的文件 第二次运行失败,EPERM(权限被拒绝)。

您应该指定写访问权限:

open(filename, O_WRONLY | O_CREAT, S_IWUSR)

或使用默认的umask:

open(filename, O_WRONLY | O_CREAT)