我编写了一个简单的程序来测试lsetxattr()和lgetxattr()函数。 我只想在此文件中添加扩展属性,然后再次获取值。 但我无法按预期得到结果。 那么使用这两种方法的正确方法是什么? 谢谢!
#define _GNU_SOURCE
#include <ctype.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/xattr.h>
#include <time.h>
#include <unistd.h>
int main()
{
char *path = "/tmp/abc.txt";
FILE *file = fopen(path, "w");
int id = 101;
if (lsetxattr(path, "user.id", &id, sizeof(int), 0) < 0)
printf("lsetxattr wrong\n");
int result;
if (lgetxattr(path, "user.id", &result, sizeof(int)) != sizeof(int)) {
printf("lgetxattr wrong\n");
}
printf("%d\n", result);
return 0;
}
答案 0 :(得分:1)
这可能是因为您的/tmp
挂载不支持扩展属性。查看man page:
ENOTSUP
Extended attributes are not supported by the file system, or are
disabled, errno is set to ENOTSUP.
您可以通过更改该挂载之外的路径来验证这一点,例如在当前目录中(假设它当然位于该挂载之外):
char *path = "abc.txt";
假设您的其他坐骑当然支持扩展属性(这更有可能)。如果您必须在/tmp
上执行此操作,那么您必须查看一些手册,以了解如何在/tmp
(tmpfs)上启用它。
答案 1 :(得分:0)
默认情况下,lsetxattr()
和lgetxatter()
看起来都会返回-1
:
#include <errno.h>
#include <sys/xattr.h>
ssize_t
lgetxattr (const char *__path, const char *__name,
void *__value, size_t __size)
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (lgetxattr)
#include <stub-tag.h>
我在glibc的源代码中找到了这个:lgetxattr.c和lsetxattr.c