Unix C 学习之元数据

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

  1. 使用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”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值