实现mypwd

Posted besty-zyx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现mypwd相关的知识,希望对你有一定的参考价值。

任务详情

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

关于pwd命令

  1. 命令功能:查看”当前工作目录“的绝对路径
  2. 参数:
    • 一般情况下不带任何参数
    • -L:显示当前的路径,有连接文件时,直接显示连接文件的路径,(不加参数时默认此方式)。
    • -p:显示当前的路径,有连接文件时,不使用连接路径,直接显示连接文件所指向的文件;当包含多层连接文件时,显示连接文件最终指向的文件。
    • --help:显示帮助信息。
    • --version:显示版本信息。
  3. Linux下pwd
  • man pwd
    技术分享图片
  • 查看相关系统调用函数信息:man -k dir | grep 2
    技术分享图片
    • getcwd()getcwd(char *buf,size_t size)
      • 将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数size为buf的空间大小
      • 技术分享图片
    • readdir()readdir(DIR* dir)返回参数dir 目录流的下个目录进入点
      • 技术分享图片
      • 需要搭配opendir()使用:opendir (const char * path )获取path子目录下的所由文件和目录的列表,如果path是个文件则返回值为NULL
      • 对于它的实现,我们首先要知道,目录在Linux中其实也是一种文件,所以它也是由inode+数据块构成的,每一个列表记录inode-number+filename
    • chdir()int chdir(const char *path )用于改变当前工作目录,调用参数是指向目录的指针,调用进程需要有搜索整个目录的权限。
      • 技术分享图片

伪代码实现

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

代码实现

实现截图

  • getcwd()
    技术分享图片
  • readdir()
    技术分享图片






以上是关于实现mypwd的主要内容,如果未能解决你的问题,请参考以下文章

实现mypwd

实现mypwd

实现mypwd

20155227 实现mypwd

实现mypwd

2017-2018-1 20155210 《信息安全系统设计基础》 实现mypwd