2017-2018-1 20155321 《信息安全系统设计基础》课堂实践——实现mypwd

学习pwd命令

  • pwd命令:输出当前工作目录的绝对路径

  • 还可通过man pwd具体查看pwd的详细用法

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

  • 通过输入命令man -k directory | grep 2寻找可以实现打印当前目录的系统调用函数,根据结果发现getcwd()函数可以实现此功能

  • 通过命令man getcwd查看此函数的具体用法(包括其需要用到的头文件#include <unistd.h>和此函数相应的参数)

  • 因此可得到相应的伪代码:

定义一个char数组用来保存当前目录的绝对路径;
调用内核函数```getcwd()```获取当前目录的绝对路径并保存至数组中;
if(返回的指针==NULL)
调用函数中存在错误,输出错误警告;
else
直接打印结果

实现mypwd

  • 根据上述的伪代码可得到以下代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
char buf[1024], *cwd =getcwd(buf, sizeof(buf));
if (cwd == NULL)
{
printf("error!\n");
exit(1);
}
else
printf("%s\n", cwd);
return 0;
}

测试mypwd

  • 编译并运行可得到正确结果

实验反思

  • 上述做法是直接调用了系统函数,没有涉及到文件系统的细节知识,在Linux系统上,一个文件a可抽象为三个层次,如下图所示:

  • 关于i-nodei-node存储着根文件线管的属性信息以及指向该文件内容数据块的指针信息。一个i-node使用一个整数值(inode-number)来代表一个文件,该值对于一个文件系统而言是唯一的,即通过该值可以找到其对应的i-node。一般情况下,一个文件只有一个inode信息来描述它。
  • 接下来就要获得i-node,可用stat()函数进行实现,stat()函数的相关信息以及stat结构体如下所示:



  • 打印i-node信息的相关代码如下
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
int main(int argc, char* argv[])
{
struct stat file_stat;
if (stat(argv[1], &file_stat) != 0)
{
printf("error!\n");
exit(0);
}
else
{
struct stat *fs = &file_stat;
printf("inode: \t\t\t\t%ld\n", fs->st_ino);
printf("protection: \t\t\t%o\n", fs->st_mode);
printf("number of hard links: \t\t%lu\n", fs->st_nlink);
printf("user ID of owner: \t\t%d\n", fs->st_uid);
printf("group ID of owner: \t\t%d\n", fs->st_gid);
printf("file size in bytes: \t\t%ld\n", fs->st_size);
printf("time of last access: \t\t%s", ctime(&fs->st_atime));
printf("time of last modification: \t%s", ctime(&fs->st_mtime));
printf("time of last change: \t\t%s", ctime(&fs->st_ctime));
}
return 0;
}
  • 打印了mypwd.c文件的i-node信息,如下所示:

  • Linux系统中,目录A包含文件b,从文件系统的角度理解就是目录A的内容列表里有一个文件b的列表项,即binode-numberb``````filename

  • 用此方法实现pwd命令的伪代码如下所示:

  while(1)
{
通过文件名”.”获取当前目录的inode-number
通过文件名”..”获取当前目录的上一级目录的inode-number
if(当前目录的inode-number==上级目录的inode-number)
{
输出完整路径; //说明已是根目录
退出程序 ;
}
else
{
切换至父级目录获取并的inode-number
在父级目录中搜索对应的文件名并记录下来
}
}
  • 实验代码如下
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <unistd.h> //根据文件名获取文件inode-number
ino_t get_ino_byname(char *filename)
{
struct stat file_stat;
if (stat(filename, &file_stat) != 0)
{
printf("error!\n");
exit(0);
}
return file_stat.st_ino;
} //根据inode-number ,在当前目录中查找对应的文件名
char* find_name_byino(ino_t ino)
{
DIR *dp = NULL;
struct dirent *dptr = NULL;
char *filename = NULL;
if (NULL == (dp = opendir(".")))
{
printf("error!\n");
exit(0);
}
else
{
while (NULL != (dptr = readdir(dp)))
{
if (dptr->d_ino == ino)
{
filename = strdup(dptr->d_name);
break;
}
}
closedir(dp);
}
return filename;
} int main(int argc, char *argv[])
{
//记录目录名的栈
char *dir_stack[100];
unsigned current_depth = 0; while(1){
//通过特殊的文件名“.”获取当前目录的inode-number
ino_t current_ino = get_ino_byname(".");
//通过特殊的文件名“..”获取当前目录的父级目录的inode-number
ino_t parent_ino = get_ino_byname(".."); if (current_ino == parent_ino)
break; //到达根目录
//否则切换至父级目录,根据步骤1获取的inode-number,在父级目录中搜索对应的文件名并记录下来
chdir("..");
dir_stack[current_depth++] = find_name_byino(current_ino);
} //输出完整路径名
int i = current_depth-1;
for (i = current_depth-1; i>=0; i--) {
printf("/%s", dir_stack[i]);
}
printf("%s\n", current_depth==0 ? "/" : ""); return 0;
}
  • 实验结果如下,打印当前目录的绝对路径

2017-2018-1 20155321 《信息安全系统设计基础》课堂实践——实现mypwd的更多相关文章

  1. 20155326 2017-2018-1 《信息安全系统设计基础》第2周学习及课堂总结myod

    20155326 2017-2018-1 <信息安全系统设计基础>第1次学习及课堂总结myod 虚拟机之前出了一些问题,然后我重新弄了一个新的虚拟机. 先在虚拟机里面安装了git. 安完以 ...

  2. 20155308《信息安全系统设计基础 嵌入式C语言课堂考试补博客

    20155308<信息安全系统设计基础 嵌入式C语言课堂考试补博客 知识点 置位 ?bits = bits | (1 << 7) ; /* sets bit 7 */ bits |= ...

  3. 20155217 《信息安全系统设计基础》week16课堂测试

    20155217 <信息安全系统设计基础>week16课堂测试 在作业本上完成附图作业,要认真看题目要求并提交作业截图. 在set的过程中,我们需要将hour部分进行赋值,赋值我们采用&q ...

  4. 2017-2018-1 20155232 《信息安全系统设计基础》第十周课堂测试(ch06)补交

    # 2017-2018-1 20155232 <信息安全系统设计基础>第十周课堂测试(ch06)补交 上课时完成测试后在提交的时候,没有提交成功,进行补交. 1.下面代码中,对数组x填充后 ...

  5. 2017-2018-1 20155305 《信息安全系统设计基础》第四周学习总结(课堂提交作业未来得及提交码云链接myod补充博客)

    2017-2018-1 20155305 <信息安全系统设计基础>第四周学习总结(课堂提交作业未来得及提交码云链接myod补充博客) 课堂提交题目要求 编写MyOD.java 用java ...

  6. 2017-2018-1 20155317 《信息安全系统设计基础》课堂实践——实现mypwd

    2017-2018-1 20155317 <信息安全系统设计基础>课堂实践——实现mypwd 1 . 学习使用pwd 很显然pwd命令的意思是打印出该文件当前的绝对路径 2 . 了解pwd ...

  7. 2017-2018-1 20155330 《信息安全系统设计基础》第10周课堂测试&课下作业

    2017-2018-1 20155330 <信息安全系统设计基础>第10周课堂测试&课下作业 stat命令的实现-mysate 学习使用stat(1),并用C语言实现 提交学习st ...

  8. 20155216 2017-2018-1 《信息安全系统设计基础》第二周课堂练习补交以及Myod的实现

    20155216 2017-2018-1 <信息安全系统设计基础>第二周课堂练习补交 课堂测试3:行断点的设置 运行截图: 未完成原因:课前未安装 cgdb 具体步骤: 1.输入命令:gc ...

  9. 20155305《信息安全系统设计基础》10月18日课堂 fork,exic,wait

    20155305<信息安全系统设计基础>10月18日课堂 fork,exic,wait fork()函数 1.fork函数作用 一般来讲, 我们编写1个普通的c程序, 运行这个程序直到程序 ...

随机推荐

  1. 单例模式中的volatile关键字

    在之前学习了单例模式在多线程下的设计,疑惑为何要加volatile关键字.加与不加有什么区别呢?这里我们就来研究一下.单例模式的设计可以参考个人总结的这篇文章   背景:在早期的JVM中,synchr ...

  2. 【转】用instruments来检验你的app

    一篇非常好的关于instruments使用的文章! 连接在此

  3. JS数据模板分离(告别字符串拼接)-template

    刚开始在写第一个动态网页的demo时,由于html不多,便使用字符串拼接的方法添加到dom来渲染,可是在后来写某外卖app时也需要如此添加,打开代码一看几千行,突然感觉累觉不爱 一行行的拼接有这功夫别 ...

  4. chrome最新版49跨域问题

    chrome最新版49跨域问题   一.最新版49要用新的参数 加--user-data-dirwindows:"C:\Program Files\Google\Chrome\Applica ...

  5. BZOJ4321:queue2(DP)

    Description n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行.现在想知道,存在多少方案满足沙茶们如此不苛刻 ...

  6. ovs的卸载删除

    参考博客1 参考博客2 需要更新.重装ovs时需要先卸载. 删除网桥.端口 ovs-vsctl del-br 交换机名 ovs-vsctl del-port 交换机名 端口名(网卡名) 关闭服务 su ...

  7. Gradle Goodness: Display Available Tasks

    To see which tasks are available for our build we can run Gradle with the command-line option -t or ...

  8. jquery 查找已经选中的下拉框/select

    $("select[name='select_name']").find('option:selected').text(); $('#select_name option:sel ...

  9. 【CSS3基础-Flex布局】

    关于Flex 背景 在flex布局出现以前,常用的水平和垂直居中对齐方式有很多.flex布局的出现基本规范了这一过程. 通过justify-content和align-items两个属性即解决了水平居 ...

  10. 【原创】如何使用Jmockit进行单元测试

    如何使用jmockit进行单元测试 1. Jmockit简介 JMockit 是用以帮助开发人员编写测试程序的一组工具和API,它完全基于 Java 5 SE 的 java.lang.instrume ...