元数据(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”