- 1、本文档共24页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第3章 目录与文件属性:编写ls 本章摘要 概念与技巧 目录是文件的列表 如何读取目录的内容 文件类型及获知途径 文件属性及获知途径 位操作及掩码的作用 用户组ID及passwd数据 相关系统调用与函数 Opendir、readdir、closedir、seekdir、stat、chmod、chown、utime、rename 相关命令 ls 如何读取文件名及其属性? 文件有哪些属性? 大小、拥有者、权限和类型等 文件存放在何处? 在目录树中 为此,应了解 ls 命令然后编写自己的 ls 问题 1:ls 命令能做什么? 列出目录的内容 显示文件的属性信息 了解文件系统树 磁盘被组织成一棵目录树,每个目录都包含文件或/和子目录。 命令 ls、pwd 和 cd 使得你可以遍历文件系统。 问题 2:ls 是如何工作的? 目录是包含文件列表和/或其他目录的特殊文件,每个目录都包含两个目录项“.”和“..” 可以像读一般文件那样读取它的内容(open、read、close) 但是,每个目录项是一个数据结构,且因文件系统而异,Unix/Linux支持多种文件系统,故用操作一般文件的方法不合适 怎样读取一个目录? 查联机帮助 man –k direct man –k direct | grep read 答案:opendir()、readdir()、closedir() 问题3:如何编写 ls 分析 ls1.c 改进 ls1.c 分栏输出 排序输出 支持 –a 选项 支持 –l 选项 如何支持 –l 选项? 注意:文件属性信息不在目录之中 问题 1:ls -l 选项能显示什么信息? 修改时间、大小、拥有者、属组、链接数、类型和权限等 问题 2:到哪里读取这些属性? 根据联机帮助,可使用stat系统调用 stat 如何得到文件信息? 进程 struct stat 文件内容 文件属性信息 stat(name,ptr) 将name所指定 的文件属性信息 读入一个结构中 示例代码: filesize.c stat 提供的其他信息 struct stat包含的成员: st_mode: 文件类型及许可权限 st_uid: 文件拥有者的ID st_gid: 文件所属组的ID st_size: 文件的大小 st_nlink: 文件的硬链接数 st_atime: 文件最后访问的时间 st_ctime: 文件属性最后修改的时间 st_mtime: 文件最后修改的时间 你要做的事情 从目录中读取文件名 用stat获取该文件的属性信息 把读到的结构信息显示出来 示例代码:fileinfo.c 示例结果与 ls –l 的对比 OK 使用ctime转换即可 需要把数字 ID 转换成字符名称 需要研究研究 类型与权限是如何存储的? u g s r w x r w x r w x 用户 属组 其他用户 文件类型 suid sgid sticky 用4位模式 表示,16种 可能的类型 每种权限或开或关,用1位 (1或0)表示即可 类型与权限被编码在一个16位的无符号整数中:位或位域 如何获取位或位域的值? 使用掩码进行与操作,例如: 原值 掩码 结果 为方便书写,掩码被定义为用八进制表示的宏名称。例如 #define S_IFMT 0170000 将模式值编码成字符串 例如,用下面的代码可判断文件是否是目录 If ((info.st_mode S_IFMT) == 0040000) printf(“this is a directory”) 为方便编程,在sys/stat.h中定义了若干宏。例如判断文件是否为目录宏是: #define S_ISDIR(m) (((m)0170000))==(0040000)) 解码模式值的函数:mode_to_letters 如何转换用户ID和组ID? 查联机帮助可知/etc/passwd文件包含用户名及用户ID,但该文件不一定包含所有用户,为此应通过库函数getpwuid。该函数提供对用户信息的访问,它返回一个有关用户信息的结构指针。同理,应通过库函数getgrgid获得组名而非通过/etc/group文件。 编写 ls2.c 至此,所有转换问题均已解决。 下面分析 ls2.c 三个特殊的位 设置用户ID:set-user-ID 运行程序的用户暂时获得程序拥有者的权限 设置组ID:set-group-ID 运行程序的用户暂时获得程序属组的权限 粘着位:sticky 保持在交换区中 文件只能被创建者删除 设置与修改文件的属性 文件类型 权限位与特殊属性位 creat、umask、chmod 文件的链接数 link、unlink 文件的所有者与属组 creat、chown、chgrp 文件大小 时间
文档评论(0)