【问题标题】:Setting permissions to a directory using C++使用 C++ 设置目录的权限
【发布时间】:2019-09-24 13:04:06
【问题描述】:

我尝试创建新目录并设置其权限(最多使用 c++11 且不使用 boost),以便用户、组和其他人可以列出其中的文件并读取它们并写入新文件(linux环境)。

#include <sys/stat.h>
#include <sys/types.h>

int main(void) {
  const char* path = "/tmp/newDir";
  mode_t process_mask = umask(0);
  int syscall_status = mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO);
  umask(process_mask);
  return syscall_status;
}

此代码基于 mkdir(和 umask)的 man (2) 页。 但是创建的目录具有rwxr-xr-x 权限(组和其他人不能写入)。 我也尝试在目录上使用 chmod syscall,但它没有解决问题。 stackoverflow 中的其他来源处理了文件(而不是文件夹),并且尝试在我的目录上应用文件方法也不起作用。

另外,我想避免从 stdlib 调用 system(),如果我找不到解决方案,这是我将使用的最后一个选项(安全考虑)。

【问题讨论】:

  • 我强烈推荐 Boost.Filesystem。或者,如果你有 C++17,&lt;filesystem&gt;
  • 您以什么权限级别运行程序?
  • @AndyG 我不能使用 boost 和 c++11 编译(不能更新)。
  • @ryyker 用户级别,并且我对父目录 /tmp/ 有 rwx 权限
  • @RonU:我对您的 C++ 版本表示同情 :-)。总体而言,无法使用 Boost 并不是最糟糕的事情。无论如何,它往往会潜入您的代码库并膨胀您的标题。

标签: c++ linux


【解决方案1】:
char* path = "/tmp/newDir";

除了语法错误之外,这是自 C++11 以来的格式错误。在此之前,这将使用已弃用的转换。字符串文字在 C++ 中是 const -> 使用指向 const 的指针。

除此之外,假设是 POSIX 系统,该程序是正确的。如果失败,您可以查看errno 了解原因。如果您没有获得所有权限:检查父目录是否有默认 ACL;这将覆盖 umask。

在 C++ 中创建目录的可移植方式是 std::filesystem::create_directory,而设置权限的方式是 std::filesystem::permissions

【讨论】:

  • path 变量只是我为了关注问题而写的,在实际代码中它是来自其他地方的 const 字符串,当然没有拼写错误:)。 std::filesystem 对我没有帮助,因为我使用的是 c++11(我在 cmets 中写了这个,但为了进一步清晰,我会编辑这个问题)
  • @RonU 你应该看看 ACL,这是最重要的部分。 linuxconfig.org/how-to-manage-acls-on-linux
  • @Swift-FridayPie 当我通过终端运行 'chmod 777 /tmp/newDir' 时(与运行程序的用户相同)它授予 dir 所需的权限,所以它有意义吗ACL 阻止了我?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 2019-05-11
  • 2017-11-20
  • 2012-11-15
  • 2020-01-27
  • 2013-07-11
相关资源
最近更新 更多