• 2017-2018-1 20155318 《信息安全系统设计基础》第九周课下实践——实现mypwd


    2017-2018-1 20155318 《信息安全系统设计基础》第九周课下实践——实现mypwd

    相关知识

    man -k

    1. 查找含有关键字的内容
    2. 与管道命令结合使用:man -k k1 | grep k2 | grep k3 ...
    3. 查看某命令在指定区段内的解释:man 区段号 命令

    8个区段:

    1. Linux中的一般命令
    2. 系统调用
    3. 库函数,涵盖了C语言的标准函数库
    4. 特殊文件(通常是/dev中的设备)和驱动程序
    5. 文件格式和约定
    6. 游戏和屏保
    7. 杂项
    8. 系统管理命令和守护进程
    • pwd命令显示整个路径名(绝对路径)可以不带任何参数直接执行pwd

    • 在linux 中的文件系统中,数据块用来存放文件的内容数据,数据块的数目根据文件内容的大小而定。

    • inode称为信息节点,其作用有二:

    1. 存储跟文件相关的属性信息,如修改时间、所有者、文件类型和文件长度,注意这些信息里并没有文件名;
    2. 存储指向文件内容数据块的指针信息。
    • 在一个文件系统中,一个inode代表一个文件,并使用一个整数值来标志该inode,称为inode-number,该值对于一个文件系统而言是唯一的,即通过该值可以找到其对应的inode。一般情况下,一个文件只有一个inode信息

    • 可以通过stat指令查看

    • 可以使用df命令查看每个硬盘分区的inode总数和已经使用的数量

    • Unix/Linux系统中,目录也是一种文件。打开目录实际上是打开目录文件。
      目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

    设计实现

    • 使用系统调用接口(getcwd)

    • 执行我们的mypwd效果与执行pwd效果一致

    • 注意在其他目录下执行时需要先将mypwd的可执行文件拷到目录下!

    但是这不能体现出pwd的实质,已知在Unix文件系统的根目录中,“."和“..”指向同一个i节点,我们可以以此判断是否发到达了根目录。因此可以利用'.'和'..'指向同一个i节点作为判断是否到达根节点的判断条件,运用递归函数,输出绝对路径

    • 伪代码如下:
    当'.'和'..'不指向同一个i节点时
    切至父目录,寻找当前i节点编号对应的文件名
    

    几个重要函数

    • get_inode函数:获取当前目录下的文件信息
    • void inode_to_dirname(ino_t inode_num, char buf,int buflen)函数:将索引节点转化为相应的文件名
    while ((dire = readdir(dir_ptr)) != NULL)  
        {  
            if (dire->d_ino == inode_num)  
            {  
                strncpy(buf, dire->d_name, buflen);  
                buf[strlen(buf)] = '';  
                closedir(dir_ptr);  
                return ;  
            }  
        }  
    
    • void get_work_dir(ino_t inode_num)函数
    • 传入一个索引节点,并求得父目录的索引节点,判断两者是否相等,相等则说明已经到了根文件夹下,可以终止递归调用;如若不相等,则进入父目录,然后通过inum_to_name函数功能,将之前的目录名拷贝到its_name字符数组中,准备输出打印
    • 运行结果和pwd自身效果对比,如下

    代码链接

    参考资料

  • 相关阅读:
    golang模拟动态高优先权优先调度算法
    【2019腾讯暑期实习生正式批笔试1,2】
    golang优先队列
    git常见操作
    小L的试卷
    Unable to connect to the Redgate Client Service. Sql Prompt 报错不能用解决
    未能加载文件或程序集“Microsoft.VisualStudio.Enterprise.AspNetHelper, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。
    LumiSoft 邮件操作删除(无法删除解决方法)
    .net MVC 项目中 上传或者处理进度获取方案
    C# mvc Request 请求过长报404错误的解决思路分析
  • 原文地址:https://www.cnblogs.com/lxy1997/p/7861020.html
Copyright © 2020-2023  润新知