【发布时间】:2016-10-29 16:16:39
【问题描述】:
我有一个字符串“rwxrwxrwx”。
如何将其转换为 mode_t 类型以在 chmod 系统调用中使用?权限应该是 -rwxrwxrwx。
【问题讨论】:
-
如果权限字符串是常量
"rwxrwxrwx",您可以简单地写成0777或<unistd.h>中定义的常量的广泛而繁琐的位组合。
标签: c linux string permissions mode
我有一个字符串“rwxrwxrwx”。
如何将其转换为 mode_t 类型以在 chmod 系统调用中使用?权限应该是 -rwxrwxrwx。
【问题讨论】:
"rwxrwxrwx",您可以简单地写成0777 或<unistd.h> 中定义的常量的广泛而繁琐的位组合。
标签: c linux string permissions mode
您可以使用此代码。但是,可以使用 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_IRUSR、S_IWUSR、S_IXUSR 等,如中所述man 2 open 手册页。还可以设置其他三个位:S_ISUID 用于??S?????? (set-user-id),S_ISGID 用于?????S??? (set-group-id),S_ISVTX 用于????????T (粘性)。
这是一个使用单个表达式的解决方案:
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')));
【讨论】: