我的以下程序复制了一个文件,但由于"权限被拒绝",我不允许我复制文件。但是,我给了它权限。
#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;
}
答案 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);