【问题标题】:Convert string to mode_t [closed]将字符串转换为 mode_t [关闭]
【发布时间】:2016-10-29 16:16:39
【问题描述】:

我有一个字符串“rwxrwxrwx”。

如何将其转换为 mode_t 类型以在 chmod 系统调用中使用?权限应该是 -rwxrwxrwx。

【问题讨论】:

  • 如果权限字符串是常量"rwxrwxrwx",您可以简单地写成0777<unistd.h> 中定义的常量的广泛而繁琐的位组合。

标签: c linux string permissions mode


【解决方案1】:

您可以使用此代码。但是,可以使用 for 循环和一些模数来缩短它。

const char *perm = "rwxrwxrwx";
mode_t mode = 0;

if (perm[0] == 'r')
  mode |= 0400;
if (perm[1] == 'w')
  mode |= 0200;
if (perm[2] == 'x')
  mode |= 0100;
if (perm[3] == 'r')
  mode |= 0040;
if (perm[4] == 'w')
  mode |= 0020;
if (perm[5] == 'x')
  mode |= 0010;
if (perm[6] == 'r')
  mode |= 0004;
if (perm[7] == 'w')
  mode |= 0002;
if (perm[8] == 'x')
  mode |= 0001;

【讨论】:

  • 谢谢!终于成功了! :)
  • 如果它使用例如检查长度,我希望这个答案更好。 strspn(perm, "-rwxST"),如果十个字符长,则跳过初始的 -d(用于目录标志),并分别使用符号常量 S_IRUSRS_IWUSRS_IXUSR 等,如中所述man 2 open 手册页。还可以设置其他三个位:S_ISUID 用于??S?????? (set-user-id),S_ISGID 用于?????S??? (set-group-id),S_ISVTX 用于????????T (粘性)。
【解决方案2】:

这是一个使用单个表达式的解决方案:

const char *perm = "rwxrwxrwx";
mode_t mode = (((perm[0] == 'r') * 4 | (perm[1] == 'w') * 2 | (perm[2] == 'x')) << 6) |
              (((perm[3] == 'r') * 4 | (perm[4] == 'w') * 2 | (perm[5] == 'x')) << 3) |
              (((perm[6] == 'r') * 4 | (perm[7] == 'w') * 2 | (perm[8] == 'x')));

【讨论】:

  • 感谢您的帮助! :)
猜你喜欢
  • 2014-03-15
  • 2011-06-14
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
相关资源
最近更新 更多