轉自:https://blog.csdn.net/ganggexiongqi/article/details/7661024
擴展屬性(xattrs)提供了一個機制用來將《鍵/值》對永久地關聯到文件,讓現有的文件系統得以支持在原始設計中未提供的功能。擴展屬性是文件系統不可知論者,應用程序可以通過一個標准的接口來操縱他們,此接口不因文件系統而異。每個擴展屬性可以通過唯一的鍵來區分,鍵的內容必須是有效的UTF-8,格式為namespace.attribute,每個鍵采用完全限定的形式。 需要注意的是這里的值可以是任意字節的數組,未必是字符存,而且最后可能不是null,這樣在訪問的時候必須知道值的大小。在設置的時候當然也就需要設置值大小。 一個擴展屬性的用處:GUI的文件管理程序的行為根據文件類型而異。要判斷文件的格式,Winodws之類的操作系統僅需要查看文件的擴展名就可以了,而Unix系統往往需要查看文件的內容來判斷類型。有些文件管理程序會直接產生此信息,有些則會將產生的信息緩存起來以備下次使用。一個更好的做法就是將此類元數據存入擴展屬性。 Linux下定義的4種擴展屬性命名空間: system:用於實現利用擴展屬性的內核功能,例如訪問控制表。eg:system.posix_acl_access便是位於此用戶空間的擴展屬性,用戶是否可以讀取或寫入這些屬性取決於所使用的安全模塊。 security:用於實現安全模塊。 trusted:把受限制的信息存入用戶空間。 user:一般進程所使用的標准命名空間,經過一般文件權限位來控制此命名空間的訪問。 下面是一個使用擴展屬性的例子: 創建磁盤 # dd if=/dev/zero of=/opt/testptn count=512 # mke2fs xattr_disk 掛載磁盤 # mount -o loop,user_xattr xattr_disk mnt 擴展特性的操作 # touch test.txt 設置擴展特性 # setfattr -n user.abc -v 123 test.txt 顯示擴展特性 # getfattr -n user.abc test.txt # file: test.txt user.abc="123" 再一個例子: #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/xattr.h> #include <sys/types.h> void testset(){ char key[7] = {'u','s','e','r','.','#','\0'}; char value[2] = {'#','\0'}; int i, ret; for(i = 0; i < 10; i++){ key[5] = value[0] = '0'+i; ret = setxattr("test", key, value, 2, 0); } } void testlist(){ char buf[1000]; int ret, i=0, j = 0; printf("The key on test are:\n"); ret = listxattr("test", buf, 1000); while(i < ret){ printf("%s\n", buf+i); i += strlen(buf+i); i++; } } void testremove(){ char key[7] = "user.2"; int ret; ret = removexattr("test", key); printf("%d\n", ret); } void testget(){ char key[7] = "user.#"; char value[3]; int ret, i; printf("The <key,value> on test are:\n"); for(i = 0; i < 11; i++){ key[5] = '0'+i; ret = getxattr("test", key, value, 3); if(ret != -1) printf("<%s,%s>\n", key, value); } } int main(){ testset(); testlist(); testremove(); testget(); return 0; }