复制程序:文件权限被拒绝

时间:2018-01-31 06:11:43

标签: c linux unix permissions system-calls

我的以下程序复制了一个文件,但由于"权限被拒绝",我不允许我复制文件。但是,我给了它权限。

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    int fdinput, fdoutput; //file pointers
    char arrbuf[5000]; //size of what can be read in file
    ssize_t bytesR, bytesW;//number of what input returns

    mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IROTH |S_IXOTH ;

    fdinput = open(argv[1], O_RDONLY); //pointing to read file

    fdoutput = open(argv[2], O_WRONLY);//pointing to write file

    if(fdinput == -1){
    perror("the source file cant be opened");
    return 1;
    }

    if(fdoutput == -1){
    perror("the written file cant be opened");
    return 2;
    }

    while((bytesR = read(fdinput, arrbuf, sizeof arrbuf)) > 0){
        bytesW = write(fdoutput, arrbuf, (ssize_t) bytesR);
    }

    close(fdinput);
    close(fdoutput);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

问题在于对目标文件的系统调用 open()的调用(即:由于副本而创建的文件):

fdoutput = open(argv[2], O_WRONLY);

可以创建目标文件

首先,open()上方的调用会打开argv[2]给定名称的文件,仅在已退出时打开。否则,系统调用失败(errno设置为ENOENT)并且perror()生成:

  

写入的文件无法打开:没有这样的文件或目录

如果文件尚不存在,为了创建该文件,O_CREAT标志必须与O_WRONLY一起 ORed

截断已存在的目标文件

如果目标文件已存在,您肯定希望在open()将现有文件的长度截断为零。这可以通过 ORing O_TRUNC标志与其他标志一起实现。

为要创建的文件提供权限

让我们看一下open()系统调用的原型:

int open(const char *path, int oflag, ...);

最后的...是指定一种可选参数。只有在创建新文件时,open()才会使用该参数。它提供模式位以应用于要创建的文件。这不完全是要创建的文件的权限,但它与它们密切相关(有关详细信息,请参阅: file mode creation mask )。

您创建了mode类型的mode_t,但忘记将其传递给open()

考虑到上述所有内容,您的通话应如下所示:

fdoutput = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, mode);