Unix C 学习之元数据

mac2024-03-13  31

元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息。

使用stat(2)获取文件的元数据   #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(const char *pathname, struct stat *buf); 功能:获取文件元数据 参数: pathname 指定了要操作的文件的路径 buf 将文件的身份信息存储到buf指定的地址空间里 返回值: 成功 0 错误 -1 errno被设置   结构体说明,详见man手册中stat(2)

struct stat{ dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device ID (if special file) */ off_t st_size; /* total size, in bytes */ blksize_t st_blksize; /* blocksize for filesystem I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ struct timespec st_atim; /* time of last access */ struct timespec st_mtim; /* time of last modification */ struct timespec st_ctim; /* time of last status change */ #define st_atime st_atim.tv_sec /* Backward compatibility */ #define st_mtime st_mtim.tv_sec #define st_ctime st_ctim.tv_sec };

(1)结构体中各种类型的实际类型,可在包含对应的头文件后,gcc -E 输出.i文件,然后搜索查看把哪个类型定义为了mode_t等类型。 (2)mode_t st_mode的操作,可在inode(7)中查看,Ubuntu16.04可在stat(2)中查看,里面有各种宏可以使用,来判断文件类型和权限。 (3)硬链接,文件名指向inode,inode与具体的文件相对应,硬链接数,有多少个文件名指向该inode。 (4)软链接,文件名对应一个自己的inode,但是inode的内容为另一个文件名,即该文件名通过另一个文件名指向一个inode。 (5)可以通过uid和gid获得用户和用户组的详细信息 用户的信息保存在/etc/passwd文件中冒号分割 第一列 用户名 第二列 用户是否有密码 第三列 用户id uid 第四列 初始组id 第五列 对用户的说明信息 第六列 用户的家目录 第七列 用户登录成功以后执行的第一个程序 struct passwd *getpwuid(uid_t uid); 返回值: 成功 返回一个地址,没有找到或者错误返回NULL,错误时errno被设置   结构体说明

struct passwd{ char *pw_name; /* username */ char *pw_passwd; /* user password , 是否设置了密码*/ uid_t pw_uid; /* user ID */ gid_t pw_gid; /* group ID */ char *pw_gecos; /* user information */ char *pw_dir; /* home directory */ char *pw_shell; /* shell program ,命令行时,用户登陆后自动第一个为用户执行的程序*/ };

用户组信息保存在/etc/group文件中冒号分割 第一列 用户组名 第二列 用户组密码 第三列 用户组id 第四列 用户组的成员 struct group *getgrgid(gid_t gid); 功能: 查找跟gid匹配的记录 参数: gid 指定要找的gid 返回值:成功 返回一个地址,没有找到或者错误返回NULL,错误时errno被设置   结构体说明

struct group { char *gr_name; /* group name */ char *gr_passwd; /* group password */ gid_t gr_gid; /* group ID */ char **gr_mem; /* NULL-terminated array of pointers to names of group members */ };

(5)将长整型转换为时间格式:linux时间戳是从19700101 00:00:00计时的 #include <time.h> char *ctime(const time_t *timep); 参数 timep 返回值 “Wed Jun 30 21:49:08 1993\n”

最新回复(0)