• 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

  • 相关阅读:
    [LeetCode] 71. Simplify Path 简化路径
    [LeetCode] 173. Binary Search Tree Iterator 二叉搜索树迭代器
    [LeetCode] 142. Linked List Cycle II 链表中的环 II
    [LeetCode] 141. Linked List Cycle 链表中的环
    读经典——《CLR via C#》(Jeffrey Richter著) 笔记_友元程序集
    读经典——《CLR via C#》(Jeffrey Richter著) 笔记_通过ILDasm.exe查看编译器如何将类型及其成员编译成元数据
    tfs强行签入和删除工作区
    需要提升权限才能运行dism
    读经典——《CLR via C#》(Jeffrey Richter著) 笔记_类型的各种成员
    Jquery 获取URL中的参数
  • 原文地址:https://www.cnblogs.com/-zyl/p/7860148.html
Copyright © 2020-2023  润新知