pwd的实现

任务要求:

1) 学习pwd命令

2) 研究pwd实现需要的系统调用(man -k; grep),写出伪代码

3) 实现mypwd

4) 测试mypwd

实现过程

1)首先查看是否有有用的命令,输入man -k directory|gerp 2

2)发现readdir好像符合我们的需求,输入man readdir查看详细资料

3)从详细资料中发现readdir符合我们的需求,这需要头文件#inlude<dirent.h>,并且readdir定义的是一个结构体,可知该函数返回一个dirent结构体指针,dirent结构体成员如下,

 struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* not an offset; see NOTES */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported
by all filesystem types */
char d_name[256]; /* filename */
};

根据老师课上的内容可以知道,linux中,文件查找不是通过文件名称来查找的。实际上是通过i节点来实现文件的查找定位的。根据在实现mypwd的过程中,我们需要用到文件的i节点,i节点跟文件的关系如下图

因此需要用到该返回值结构体中的ino_t型的d_ino,通过该返回值来打开我们所需要的文件,此外由于根节点的节点值与其父节点的节点值是一样的,因此可以通过这个条件来进行循环。

伪代码:

while(1)
{
获取当前目录的i节点值ci;
获取父级目录的i节点值pi;
if(ci==pi)判断是否到达根节点;
break;
else
打开至父级目录,根据获取的i节点值,在父级目录中搜索对应的文件名并记录下来;
输出文件名则为绝对路径; }
4)在读一个路径之前,我们需要打开这个路径,这就需要用到opendir函数,这个函数的原型是DIR *opendir(const char *name),需要的头文件是#include <sys/types.h> 和#include <dirent.h>
![](http://images2017.cnblogs.com/blog/1072918/201711/1072918-20171118230537515-1576166726.png) 5)除此之外,我们还需要知道文件的信息,这就要用到state,所需要的头文件是#include <sys/stat.h> #include <unistd.h>,使用ino_t来获取文件的节点 6)在查询到了当前文件夹名称后,需要返回父目录,重复此操作,这就需要用到chdir函数,他可以改变当前路径
![](http://images2017.cnblogs.com/blog/1072918/201711/1072918-20171118230544999-198471059.png) 7)之后就是不断地读取当前目录,并和父目录名称比对,如果当前目录和父目录的名称一致则跳出循环
## 完成结果 ![](http://images2017.cnblogs.com/blog/1072918/201711/1072918-20171118230554968-1338459308.png)

最新文章

  1. Enable rsh on MAC OS with command line
  2. 如何维护SSH安全
  3. CodeForces 164C Machine Programming 费用流
  4. Mac下运行ASP.NET Core应用程序
  5. java SWT/Rap 计算器版本2(键盘鼠标兼容)
  6. css渐变/背景
  7. Xcode中AutoLayOut的简单使用
  8. POJ - 2828
  9. CentOS7_防火墙
  10. KAPTCHA验证码使用步骤
  11. centos7 下安装mysql教程
  12. Python开发端口扫描器
  13. img没有src属性时自动出现边框
  14. IOS如何安装ipa文件
  15. [转][C#]文件流读取
  16. Java中构造方法与setter方法
  17. Httprunner学习
  18. SQL记录-PLSQL包
  19. WebGL编程指南案例解析之3D视图视区问题
  20. 动态输出的javascript中alert文本的换行问题

热门文章

  1. python queue和生产者和消费者模型
  2. springboot学习入门之五---开发Web应用之JSP篇
  3. hadoop伪分布模式安装
  4. python离线安装外部依赖包
  5. Python学习---模拟微信网页登录180410
  6. springmvc处理日期格式
  7. lumen框架的辅助函数
  8. 三星平板SM-T320刷机
  9. Python中网络编程对socket accept函数的理解
  10. Java设计模式16:常用设计模式之观察者模式(行为型模式)