zoukankan      html  css  js  c++  java
  • 20165235 实现pwd功能

    20165235 实现pwd功能

    要求

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

    实现过程

    • pwd是将当前的文件目录的绝对路径打印出来,所以要找到一个函数可以返回当前文件目录名。所以在命令行中输入man -k dir | grep get得到如下的信息:
    • 如上图:getwd正是我们所需要的,通过命令输入:man getwd得到如下信息:
    • 如上图:它所需的头文件和函数以及参数一目了然。getwd():函数功能描述:将当前工作目录的绝对路径复制到数组指针buf中。
      -根据以上信息编写代码:
    #include<stdio.h>
    #include<unistd.h>
    int main(){
     char a[100];
     getwd(a);
     printf("%s
    ",a);
     return 0;
    }
    
    
    • 编译代码并且运行,结果如下:

      但是发现以上代码过于简单,是否有一种方法是可以通过操作目录文件来进行实现pwd功能。所以有以下伪代码:
    1.打开文件目录查看所有目录如果查到当前目录中有两个相同的" ."文件说明已经到了文件根目录,也就是说本目录的i-node与上级目录的i-node相同。
    2.否则进入".."文件目录,并且将上一级件目录名记录添加到数组中
    3.直到符合1的条件为止
    
    • 首先需要打开文件目录流,命令行输入man -k open | grep dir找到了符合条件的函数:opendir。
    • 然后需要读取目录的信息,输入man -k read | grep dir,找到符合条件的函数:readdir
    • 结束需要关闭文件目录流man -k close | grep dir,找到符合条件的函数:closedir
    • 通过man opendir,man readdir,man closedir等得知各个函数所需的头文件以及函数参数

    • 对于读取文件目录流涉及到一个结构体:
    struct dirent{
      ino_t  d_ino;//文件结点号
      off_t  d_off;
      unsigned short d_reclen;
      unsigined char d_type;
      char d_name[256];//文件名
    }
    
    • 最重要的一点是要进入到上级目录中去,所以我man -k dir | change,没有查处结果,我就直接man -k dir,找到如下结果:

      所以根据以上内容编写代码:(函数模块)

    ino_t get_inode(char* fname)            //根据文件名,返回-i节点
    void inode_to_name(ino_t inode_to_find,char* namebuf,int buflen)   //找到i-节点对应的文件名,并放在字符数组里
    void printpathto(ino_t this_inode)//如果不是根目录进入上级结点,并将文件夹名存入数组,否则直接打印
    

    实验截图:

    实验代码链接

    遇到的错误

    • 当我将返回文件结点号的函数设计成如下时:
    ino_t get_inode(char* fname)            //根据文件名,返回-i节点
    {    
        DIR *dir;
        struct dirent *pdir;
        dir = opendir(fname);
        if (dir == NULL)
        {
            perror(".");
            exit(1);
        }
        while((pdir = readdir(dir)) != NULL)
        {
            if(pdir->d_name == fname)
            {
                return  pdir -> d_ino;
            }
        }
        
    }
    

    最后的结果显示为空:

    • 没能找到出错的原因,我将每次读取的文件名打印出来,也没发现有错误存在。
  • 相关阅读:
    python- 冒泡算法
    python-文件读写资料整理
    Python学习之edx6001-week4
    Python学习之自动化开发-DAY1作业-三级菜单
    python学习之自动化开发-DAY1作业-登陆程序
    python 学习之edx6001-week4
    elasticsearch RESTfull _cat api
    python
    python
    python 文件操作
  • 原文地址:https://www.cnblogs.com/qy20165235/p/10013113.html
Copyright © 2011-2022 走看看