2017-2018-1 20155318 《信息安全系统设计基础》第九周课下实践——实现mypwd
相关知识
man -k
- 查找含有关键字的内容
- 与管道命令结合使用:man -k k1 | grep k2 | grep k3 ...
- 查看某命令在指定区段内的解释:man 区段号 命令
8个区段:
- Linux中的一般命令
- 系统调用
- 库函数,涵盖了C语言的标准函数库
- 特殊文件(通常是/dev中的设备)和驱动程序
- 文件格式和约定
- 游戏和屏保
- 杂项
- 系统管理命令和守护进程
-
pwd命令显示整个路径名(绝对路径)可以不带任何参数直接执行pwd
-
在linux 中的文件系统中,数据块用来存放文件的内容数据,数据块的数目根据文件内容的大小而定。
-
inode称为信息节点,其作用有二:
- 存储跟文件相关的属性信息,如修改时间、所有者、文件类型和文件长度,注意这些信息里并没有文件名;
- 存储指向文件内容数据块的指针信息。
-
在一个文件系统中,一个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自身效果对比,如下