【问题标题】:Copy program: File Permission Denied复制程序:文件权限被拒绝
【发布时间】:2018-01-31 06:11:42
【问题描述】:

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

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

【问题讨论】:

  • 忘记提问了。由于权限被拒绝,我的程序不允许我复制文件,我给了它权限
  • 你能补充一点解释吗?错误信息等?
  • 将你的问题编辑成你的问题——不要把它变成评论。
  • 您是在复制可执行程序吗?如果不是,S_IXUSRS_IXOTH 位在权限中是不合适的(考虑到您包括其他两个,省略S_IXGRP 令人费解)。请注意,您的第二个 open() 调用会从第一个调用中践踏错误状态(在 errno 中)——如果两者都失败了。如果您的 open() 写入文件不存在,则不会尝试创建该文件,这可能也是因为您省略了包含 O_CREAT 时所需的权限参数。如果您创建,请考虑O_TRUNCO_EXCL
  • 定义和初始化mode的目的是什么?没有使用它?

标签: c linux unix permissions system-calls


【解决方案1】:

问题在于 系统调用 open()destination 文件(即:作为复制结果创建的文件)的调用:

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

使目标文件的创建成为可能

首先,上面对open() 的调用会打开具有argv[2] 给定名称的文件,仅当它已经退出时。否则,系统调用失败(errno 设置为ENOENT),perror() 产生:

写入的文件打不开:没有那个文件或目录

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

截断已经存在的目标文件

如果目标文件已经存在,您肯定希望在open()ing 时将该已存在文件的长度截断为零。这可以通过 ORing O_TRUNC 标志和其他标志来实现。

为要创建的文件提供权限

我们来看open()系统调用的原型:

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

末尾的... 是指定一种可选参数。 open() 仅在创建新文件时使用该参数。它提供了应用于要创建的文件的模式位。这并不完全是要创建的文件的权限,但它与它们密切相关(更多信息请参阅:file mode creation mask)。

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


考虑到以上所有内容,您的调用应如下所示:

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

【讨论】:

    猜你喜欢
    • 2015-09-29
    • 2018-08-03
    • 1970-01-01
    • 2011-08-24
    • 2011-11-10
    • 2012-11-24
    • 2015-03-04
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多