gpt4 book ai didi

复制程序: File Permission Denied

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:23 24 4
gpt4 key购买 nike

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

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

最佳答案

问题出在为目标 文件调用系统调用 open()(即:要创建的文件复制的结果):

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

使创建目标文件成为可能

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

the written file cant be opened: No such file or directory

为了在文件不存在的情况下创建文件,O_CREAT 标志必须与 O_WRONLY 进行或运算

截断一个已经存在的目标文件

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

为要创建的文件提供权限

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

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);

关于复制程序: File Permission Denied,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48535583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com