我有这个代码,我正在从一个文件中读取并向另一个文件写入我读过的内容。出于某种原因,我经常遇到权限错误,但只有当我创建一个新文件并尝试写入时;如果我删除了读写的块,它会创建文件并且具有正确的权限。但是,一旦我尝试编写,创建文件的权限就像这样:rwSr-Sr--
if ((dst_fd = open(dst_path, O_RDWR | O_CREAT)) < 0){
close(src_fd);
exit(1);
}
while ((n = read(src_fd, buf, BUF_SIZE)) > 0){
if (write(dst_fd, buf, n) < 0){
exit(1);
}
}
为什么会这样?我似乎无法找到我改变的东西,这使得这个开始发生但我不认为我真的做了那么糟糕的事情。
答案 0 :(得分:3)
检查文档是否已打开。签名是:
int _open(
const char *filename,
int oflag [,
int pmode]
);
注意pmode。它是可选的,你没有使用它。
您正在使用oflag,它会通知您打算执行的操作,但不设置任何权限。相反,默认情况下将应用umask建立的默认权限。如果要控制权限,还需要包含pmode。
open的文档说明在使用O_CREAT
时需要使用pmode。
因此,请添加所需的权限,通常为_S_IREAD | S_IWRITE
。
像:
open(dst_path, O_RDWR | O_CREAT, _S_IREAD | S_IWRITE))
您可能需要检查与这些标志关联的标头:
<fcntl.h>, <sys\types.h>, <sys\stat.h>