第十七章 目录及文件属性.ppt
文本预览下载声明
文件属性操作 输出结果: The size of /etc/passwd is 2360 stat提供的其它信息 ino_t st_ino; /* 节点 */ mode_t st_mode; /* 文件类型和许可权限 */ nlink_t st_nlink; /* 文件硬连接数 */ uid_t st_uid; /* 用户ID */ gid_t st_gid; /* 组ID */ time_t st_atime; /* 最后一次访问时间 */ time_t st_mtime; /* 最后一次修改时间 */ time_t st_ctime; /* 最后一次改变时间(属性) */ fileinfo.c 文件属性操作 fileinfo.c显示文件属性 如何将模式字段转换为字符? 如何将用户所有者和组字段由数值转换为用户名和组名? 文件属性操作 fileinfo.c显示文件属性 如何将模式字段转换为字符? 如何将用户所有者和组字段由数值转换为用户名和组名? 将模式字段转换为字符 printf( mode: %o\n, buf-st_mode); “100644”与“-rw-r--r--”有什么关系? st_mode是一个16位的二进制数,文件类型和权限被编码在这个数中。 模式字段的转换 type:文件类型,最多可标识16种类型,目前已使用7个 suid,sgid,sticky:文件的特殊属性 user、group、others:许可权限 字段编码 如何读取被编码的值? 0591如何知道电话号码对应的区号? 掩码(masking) 为了比较,把不需要的地方置0 使用掩码得到文件类型 文件类型在模式字段的第一个字节的前4位 在sys/stat.h中有以下定义: 使用掩码得到文件类型 if((info.st_mode 0170000) == 0040000) printf(“this is a directory”); 上述代码通过宏来代替,如下: #define __S_ISTYPE(mode, mask) (((mode) __S_IFMT) == (mask)) #define S_ISDIR(mode) __S_ISTYPE((mode), __S_IFDIR) #define S_ISCHR(mode) __S_ISTYPE((mode), __S_IFCHR) #define S_ISBLK(mode) __S_ISTYPE((mode), __S_IFBLK) #define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG) # define S_ISFIFO(mode) __S_ISTYPE((mode), __S_IFIFO) # define S_ISLNK(mode) __S_ISTYPE((mode), __S_IFLNK) 使用掩码得到文件类型及许可权限 文件属性操作 fileinfo.c显示文件属性 如何将模式字段转换为字符? 如何将用户所有者和组字段由数值转换为用户名和组名? 将用户/组ID转换成字符串 /etc/passwd包含用户列表 /etc/passwd没有包含所有的用户:NIS 通过getpwuid来得到完整的用户列表 如果用户信息保存在/etc/passwd中,那么getpwuid查找该文件的内容 如果用户信息在NIS中, getpwuid会从NIS中获取信息 使用getpwuid具有较好的移植性 将用户ID转换成字符串 getpwuid需要UID作为参数,返回一个指向struct passwd的指针,定义在/usr/include/pwd.h中 将用户ID转换成字符串 将组ID转换成字符串 /etc/group是组的列表 用户可以同时属于多个组 通过getgrgid来访问组列表 三个特殊的位 set-user-ID 解决用户如何修改自己的密码 set-group-ID 设置程序运行时所属的组 sticky set-user-ID [root@localhost ch03]# ls -l /etc/passwd -rw-r--r-- 1 root root 2360 9月 11 19:26 /etc/passwd /etc/passwd只有root用户具有修改权限,普通用户不能修改 [root@localhost ch03]# ls -l /usr/bin/passwd -r-s--x--x 1 root root 16336 2003-02-14 /usr/bin
显示全部