c - 如何获取文件的扩展属性(UNIX/C)?

标签 c macos unix permissions xattr

当我在命令行中键入 ls -l 时,有时 @+ 符号会出现在文件权限旁边(顺便说一句,我在 OS X 上),如下图:

-rw-r-----@  1 john  staff      6731 Sep 28 01:10 mutations.txt
drwxr-xr-x+ 71 john  staff      2414 Mar 25 18:16 ..

我知道如何使用 stat 结构获取权限位,但我认为这些扩展权限值不存在。关于如何通过 C 或 POSIX API 获取这些值,有人可以指出正确的方向吗?

编辑:

我尝试了以下操作:

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

int main () {
    char  l[1024];
    listxattr("/Users/john/desktop/mutations.txt", l, 1024,  XATTR_SHOWCOMPRESSION);

    printf("%s\n", l);
}

并得到输出:

com.apple.metadata:kMDItemWhereFroms

还在试图理解如何将其转换为 @+ 吗?

最佳答案

@ 表示文件有扩展属性。使用 listxattr()获取所有扩展属性的名称列表,以及 getxattr()获取特定属性的值。如果 listxattr 返回非零结果,您将显示 @ 以表明这一点。

扩展属性不在 POSIX 中,但此 API 至少在 Linux 和 OS X 中可用。

您可以找到如何使用这些函数的示例 here .

+ 表示文件有访问控制列表。在一些文件系统中,这被存储为一个特殊的扩展属性;在其他情况下,它是单独存储的。有关访问控制列表,请参阅 acl(5)作为引用,您可以找到一个显示它的示例程序 here .

关于c - 如何获取文件的扩展属性(UNIX/C)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43245438/

相关文章:

xcode - 如何在 Xcode 4.1 中调试 OpenCL 内核?

bash - 为什么在可执行文件或脚本名称之前需要 ./(点斜杠)才能在 bash 中运行它?

linux - 从日志文件中计算具有匹配模式的行

c++ - 如何将 objdump 结果发送到文件?

cocoa - 创建 bundle - 出了什么问题?

c - 使用 C 在 linux 中挂载 USB 驱动器

macos - Mac 替换 fiddler 的自动回复功能

c++ - 为什么要考虑缓冲区而不是行? fgets() 可以一次读取多行吗?

c - 为什么 Clang 认为这些类型在开罗会发生冲突?

c++ - GetAdaptersAddresses() 未给出正确的 IP 地址