7

我正在尝试了解该 stat 命令的 stat 结构的 st_mode 字段的标志,但我很难过!我在这里找到了这个例子,但我真的不明白这个代码片段:

if ( mode & S_IRUSR ) str[1] = 'r';    /* 3 bits for user  */
if ( mode & S_IWUSR ) str[2] = 'w';
if ( mode & S_IXUSR ) str[3] = 'x';

if ( mode & S_IRGRP ) str[4] = 'r';    /* 3 bits for group */
if ( mode & S_IWGRP ) str[5] = 'w';
if ( mode & S_IXGRP ) str[6] = 'x';

if ( mode & S_IROTH ) str[7] = 'r';    /* 3 bits for other */
if ( mode & S_IWOTH ) str[8] = 'w';
if ( mode & S_IXOTH ) str[9] = 'x';

我知道“&”是按位与运算符,但仅此而已。我什至不知道该问什么。

PD:很抱歉我之前提出的问题。我不知道如何标记已回答的问题或类似的问题:(

4

3 回答 3

3

mode 是一个位域,它是打包数据的常用方式。将字段中的每个位视为可以设置为关闭或打开的拨动开关。要检查切换是否打开,请检查是否使用 & 运算符设置了适当的位。您可以使用 | 设置位 并使用 ~位运算清除它们。

于 2011-06-30T02:18:02.593 回答
2

在操作系统编程中使用无符号整数来保存一系列描述某事的位是很常见的。在这种情况下,模式有 9 位感兴趣。一位告诉所有者是否可以读取,一位用于所有者写入,一位用于所有者执行,以及类似的位用于组和其他。诀窍在于提取是否设置了位。

这是一个例子。S_IRUSR 是描述“所有者读取”位的位掩码的名称。它在 规范中定义为 0400(八进制),转换为二进制 100000000。当您使用掩码获取此值的二进制和时,如果设置了掩码的第 9 位,您将获得值 100000000(二进制)。否则你得到0。

如果返回较大的值,则 if 语句的计算结果为 true,否则为 false。这样,如果设置了该位,则将“r”写入字符串的位置 1。同样的技术也适用于所有其他位。

于 2011-06-30T05:14:14.633 回答
2

好吧,POSIX 规范<sys/stat.h>列举了你可以从struct stat.

你的问题是“这个字段能告诉我什么”,还是“我如何提取信息”,或者两者兼而有之?

于 2011-06-30T02:29:07.860 回答