zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155315 《信息安全系统设计基础》加分作业:实现mypwd

    学习pwd命令

    • man pwd查看
    • pwd命令用于显示当前工作目录,是Linux下最常用的命令之一。在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置。
    • 环境变量OLDPWD表示前一次的工作目录,环境变量PWD表示当前的工作目录。
    • 目录连接链接时,pwd -P 显示出实际路径,而非使用连接(link)路径;pwd显示的是连接路径
    • /bin/pwd
      • -L 目录连接链接时,输出连接路径
      • -P 输出物理路径

    研究pwd实现需要的系统调用(man -k; grep),写出伪代码

    实现pwd有两种函数,一个是getcwd(),一个是多个函数嵌套。

    • getcwd()即得到当前工作目录,调用这个函数,返回值就是当前目录。
    • 使用系统调用函数,包括readdirchdir

    原始伪代码

    使用循环不断进入上级目录,读取目录名

    do{
        readdir(".");
        chdir("..");
    }while(i_node("..")!=i_node("."));
    

    但是在编写的过程中,发现先读取的是子目录,而要先显示的是父目录。一个解决办法是将所有读取到的目录存到数组中,从最后一个元素开始显示,但是觉得太麻烦了,改进了代码。

    改进伪代码

    pwd()
    if(i_node("..")!=i_node("."))
    {
        chdir("..");
        pwd("..");
        printf();
    }
    

    使用递归函数,就可以直接从父目录开始显示了。

    实现mypwd

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <dirent.h>
    #include <string.h>
    #include <unistd.h>
    ino_t get_inode(char*);
    void pwd(ino_t);
    void name(ino_t,char*,int);
    
    int main()
    {
        pwd(get_inode("."));  
        printf("
    ");
        return 0;
    }
    
    void pwd(ino_t this_inode)
    {
        ino_t my_inode;
        char its_name[BUFSIZ];
        if (get_inode("..")!=this_inode)                                 
        {
            chdir(".."); 
            name(this_inode,its_name,BUFSIZ);
            my_inode = get_inode(".");
            pwd(my_inode);
            printf("/%s",its_name);
        }
    }
    
    void name(ino_t inode,char* namebuf,int buflen)   //找到i-节点对应的文件名
    {
        DIR* cdir;
        struct dirent* direntp;
        cdir = opendir(".");
        while((direntp = readdir(cdir)) != NULL)
        {
            if(direntp->d_ino == inode)
            {
                strncpy(namebuf,direntp->d_name,buflen);
                namebuf[buflen-1] = '';
                closedir(cdir);
                return;
            }
        }
        printf("error looking for inode
    ");
    }
    
    ino_t get_inode(char* fname)            //根据文件名,返回-i节点
    {
        struct stat info;
        stat( fname, &info);
        return info.st_ino;
    }
    

    测试mypwd

  • 相关阅读:
    数据结构与算法之PHP实现二叉树的遍历
    数据结构与算法之二叉树的基本概念和类型
    聚集索引,非聚集索引,覆盖索引 原理
    Vue学习笔记:methods、computed、watch的区别
    xsl 和xml transform方法的调用
    Chrome , Firfox 不支持fireEvent的方法
    分布式存储
    firefox并不支持selectSingleNode和selectNodes的解决方法
    503 Service Unavailable
    处理【由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面】
  • 原文地址:https://www.cnblogs.com/-zyl/p/7860148.html
Copyright © 2011-2022 走看看