zoukankan      html  css  js  c++  java
  • 实现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
  • 相关阅读:
    使用crontab定时执行脚本时别忘了输出重定向>
    php 中函数获取可变参数的方法, 这个语法有点像 golang 语言中的
    单词number 和 numeral 的区别
    vim 调到闭合的{
    [转]文件IO详解(二)---文件描述符(fd)和inode号的关系
    js中有包装类,java中也有包装类
    cin中函数的作用
    string类小结
    结构、位域、联合、枚举之小小总结
    运算符重载(C++)
  • 原文地址:https://www.cnblogs.com/besty-zyx/p/10014441.html
Copyright © 2011-2022 走看看