前言 本文为原创,可能会存在一些知识点或理解上的问题,欢迎切磋和交流 ^_^
Listxattr/llistxattr/flistxattr作用:列出扩展属性名称
#include
#include
ssize_t listxattr(const char *path, char *list, size_t size);
ssize_t llistxattr(const char *path, char *list, size_t size);
ssize_t flistxattr(int fd, char *list, size_t size);
扩展属性以名称-键值对的形式存在,这些名称-键值对和文件、目录、软链接等的inode相关。它们是对linux系统和所有inode相关联的一些常规属性的扩展。
listxattr
获取文件系统对应path路径文件的扩展属性名称的列表。List指向的buffer用于存放获取到的扩展属性名称列表,这个buffer大小由调用者传入的size决定,size单位为字节。列表格式为一系列名称的集合,字符串最后以’\0’结尾。对于没有访问权限的调用进程的扩展属性名称会被省略。最后只返回扩展属性名称列表的长度。
Llistxattr
llistxattr和listxattr相同,但是区别在于针对软链接文件时,llistxattr系统调用获取到的是软链接文件的扩展属性名称列表,而不是软链接指向文件的扩展属性名称列表。
flistxattr
flistxattr和listxattr相同,但是区别在于传入的参数是文件描述符fd,而不是一个路径名称。
一条扩展属性名称是一个以’\0’结尾的字符串。这个扩展属性名称包括一个命名空间前缀,或者有几个和该inode相关联的命名空间。如果size指定为0,则这些系统调用返回扩展属性名称的当前大小(至少要保证这些扩展属性名称列表不变)。Size主要用来保证这些系统调用存放扩展属性名称列表的buffer的大小。(但是请注意,两次系统调用的扩展属性名称列表集合可能会发生变化,所以第二次系统调用需要检查一下返回值的状态)。
扩展属性名称列表是以’\0’结尾的字符串,如下所示:
User.name1\0system.name1\0user.name2\0
支持POSIX ACls文件权限管理的文件系统的扩展属性名称列表如下所示:
system.posix_acl_access\0system.posix_acl_default\0
getxattr/lgetxattr/fgetxattr作用是获取扩展属性值
#include
#include
ssize_t getxattr(const char*path, const char *name, void *value, size_t size);
ssize_t lgetxattr(const char*path, const char *name, void *value, size_t size);
ssize_t fgetxattr(int fd, const char *name, void *value, size_t size);
扩展属性以名称-键值对的形式存在,这些名称-键值对和文件、目录、软链接等的inode有关。它们是对linux系统和所有inode相关联的一些常规属性的扩展。
getxattr
获取和传入的name和path相关联的文件扩展属性的值。扩展属性值被存放在value指向的buffer内存中。Size表示该buffer大小,系统调用返回值是扩展属性值的字节个数。
lgetxattr
lgetxattr和getxattr相同,但是区别在于针对软链接文件时,lgetxattr系统调用获取的软链接文件的扩展属性值,而不是软链接指向文件的扩展属性值。
fgetxattr
fgetxattr和getxattr相同,但是区别在于传入的参数是文件描述符fd,而不是一个路径名称。
一条扩展属性名称是一个以’\0’结尾的字符串。这个扩展属性名称包括一个命名空间前缀,或者有几个和该inode相关联的命名空间。扩展属性值是由setxattr分配的任意文本或二进制数据内容的一部分。如果size指定为0,则这些系统调用返回扩展属性值的当前大小(至少要保证这些扩展属性值不变)。Size主要用来保证这些系统调用存放扩展属性值的buffer的大小。(但是请注意,两次系统调用的扩展属性值可能会发生变化,所以第二次系统调用需要检查一下返回值的状态)。
0表示成功
非负数表示返回的是扩展属性值的大小(以字节为单位);
-1表示系统调用失败;