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自身效果对比,如下

代码链接

参考资料

原文地址:https://www.cnblogs.com/lxy1997/p/7861020.html