【问题标题】:flags for st_mode of stat system callstat 系统调用的 st_mode 标志
【发布时间】:2011-09-25 15:15:05
【问题描述】:

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

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:对于我之前提出的问题,我深表歉意。我不知道如何标记已回答的问题或类似的内容:(

【问题讨论】:

    标签: c unix filesystems stat


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      嗯,POSIX spec for <sys/stat.h> 列举了您可以从struct stat 的 st_mode 字段中学到的所有内容。

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 谢谢,我不知道它是八进制的,所以我的程序不起作用! :-)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        相关资源
        最近更新 更多