2019-2020-1 20175313 《信息安全系统设计基础》实现mypwd

MyPWD

一、题目要求

  1. 学习pwd命令
  2. 研究pwd实现需要的系统调用(man -k; grep),写出伪代码
  3. 实现mypwd
  4. 测试mypwd

二、题目理解

Linux下pwd的功能:在命令行输入man pwd进行查看:

  1. 命令格式:pwd [选项]
  2. 命令功能:
    查看”当前工作目录“的完整路径
  3. 常用参数:
  • -L 目录连接链接时,输出连接路径。(不加参数时默认此方式)。
  • -P 输出物理路径。有连接文件时,不使用连接路径,直接显示连接文件所指向的文件;当包含多层连接文件时,显示连接文件最终指向的文件。

三、需求分析

  • 找到绝对路径,将其输出

四、设计思路

  • 问题1:如何获取文件路径?
  • 解决方法:输入man -k dir | grep 2,查看:

  • 首先,使用opendir()函数打开当前文件;
  • 其次,使用getcwd()函数返回文件当前路径;

getcwd():getcwd(char *buf,size_t size)
将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数size为buf的空间大小

  • 问题2:如何调到上一级文件路径,并修改所记录的当前文件路径?
  • 解决方法:使用readdir()函数获取当前目录的父级目录,使用chdir()改变所记录的当前文件路径;

readdir():readdir(DIR* dir)返回参数dir、目录流的下个目录进入点

chdir():int chdir(const char *path )用于改变当前工作目录,调用参数是指向目录的指针,调用进程需要有搜索整个目录的权限。

  • 问题3:如何找到一个文件的绝对路径?
  • 解决方法:从叶子节点往根节点进行搜索,当父节点与当前节点相同时,该节点即为根节点,说明搜索到头了,然后逆序输出路径即为一个文件的绝对路径。

五、伪代码分析

  • opendir();
  • 定义一个缓冲区数组buf[MAXPATH]; 调用getcwd(buf, MAXPATH); 输出返回值即为路经;
  • 通过特殊的文件名"."获取当前目录的inode-number(假设当前目录为a) ;
  • 通过特殊的文件名".."获取当前目录的父级目录的inode-number - 判断当前目录和上级目录的inode-number是否一样;
  • 如果两个inode-number一样说明达到根目录,输出完整路径,退出程序;
  • 如果两个inode-number不一样,切换至父级目录,根据步骤1获取的inode-number,在父级目录中搜索对应的文件名并记录下来,然后重新回到步骤3。

六、码云链接

七、运行结果截图

原文地址:https://www.cnblogs.com/xiannvyeye/p/12038950.html