实现mypwd

任务详情

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

关于pwd命令

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

伪代码实现

  • 通过上面我们可以发现可以通过两种函数来实现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()
    image
  • readdir()
    image
原文地址:https://www.cnblogs.com/besty-zyx/p/10014441.html