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("\n");
    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] = ‘\0‘;
            closedir(cdir);
            return;
        }
    }
    printf("error looking for inode\n");
}

ino_t get_inode(char* fname)            //根据文件名,返回-i节点
{
    struct stat info;
    stat( fname, &info);
    return info.st_ino;
}

测试mypwd

时间: 2024-11-10 13:34:19

2017-2018-1 20155315 《信息安全系统设计基础》加分作业:实现mypwd的相关文章

信息安全系统设计基础家庭作业

<深入理解计算机系统>家庭作业 * 8.9 答案: 进程对 是否并发 AB 否 AC 是 AD 是 BC 是 BD 是 CD 是 * 8.10 答案: A. 调用一次,返回两次: fork B. 调用一次,从不返回: execve, longjmp C. 调用一次,返回一次或者多次: setjmp * 8.11 答案: 这个程序会输出4个“hello”输出行. 因为Fork()函数的作用是调用一次返回两次.根据条件i<2,当 i = 0 时,输出2个hello,当 i = 1 时,输出2

20155315 《信息安全系统设计基础》课程总结

20155315 <信息安全系统设计基础>课程总结 每周作业链接汇总 第1周作业 Linux快捷键复习,信息=位+上下文,程序的生命周期,链接 二维码 第3周作业 程序是一个字节序列,布尔代数的运算,零扩展和符号扩展 二维码 第5周作业 程序的机器级表示,反汇编 二维码 第6周作业 异常及其种类,进程和并发,系统调用函数 二维码 第7周作业 Y86,ISA 二维码 第8周作业 客户端&服务器,网络和协议,并发程序 二维码 第9周作业 存储器,RAM和ROM,磁盘 二维码 第11周作业

2017-2018-1 20155315 《信息安全系统设计基础》第13周学习总结

2017-2018-1 20155315 <信息安全系统设计基础>第13周学习总结 教材学习内容总结 本周老师让我们学习的是自己觉得最终要的一章,我学习的是第十章.在我看来,不论是什么产品,都存在设计端与使用端,更确切的说,正因为有使用端,才需要设计端.因此,使用端的使用感受最为重要,而作为一个对外的平台与程序,I/O系统是基础和核心,也因此我选择系统级I/O进行深入学习. 主要知识点: 输入是从I/O设备复制数据到主存 输出是从主存复制数据到I/O设备 UnixI/O 每个unix文件都是一

2017-2018-1 20155315 《信息安全系统设计基础》第14周学习总结

2017-2018-1 20155315 <信息安全系统设计基础>第14周学习总结 教材学习内容总结 上一周我学习了I/O设备,这一周我学习了第六章,知道了内在的存储设备及磁盘构造,也更明白程序运行的道理,对我之后设计程序有很大的帮助. 在简单模型中,存储器系统是一个线性的字节数组,而CPU能够在一个常数时间内访问每个存储器位置.实际上,存储器系统是一个具有不同容量.成本和访问时间的存储设备的层次结构.CPU寄存器保存着最常用的数据.靠近CPU的小的.快速的高度缓存存储器作为一部分存储在相对慢

20145322 《信息安全系统设计基础》课程总结

#20145322 <信息安全系统设计基础>课程总结 每周作业链接汇总 第零周 预习课程知识,安装环境 第一周 Linux 目录结构及一些基本的linux操作和命令 第二周 学习内容 熟悉Linux系统下的开发环境 熟悉vi的基本操作 熟悉gcc编译器的基本原理 熟练使用gcc编译器的常用选项 熟练使用gdb调试技术 熟悉makefile基本原理及语法规范 掌握静态库和动态库的生成与调用方法 理解C程序中模块的概仿,模块分解的"高内聚,低耦合"的原则 了解链接的概念 第三周

20145326蔡馨熤《信息安全系统设计基础》期末总结

20145326蔡馨熤<信息安全系统设计基础>期末总结 每周作业链接汇总 第0周作业 简要内容:初步翻阅课本,提出问题:学会如何使用虚拟机VirtualBox并成功安装Ubantu:预习了Linux基础入门:阅读了老师推荐的博客并写出了自己的感想. 二维码: 第1周作业 简要内容:初步了解Linux操作系统:介绍了核心的Linux命令:find/locate/cheat/grep/which/whereis. 二维码: 第2周作业 简要内容:介绍了Linux系统下的开发环境.vi的基本操作.g

20145207《信息安全系统设计基础》课程总结

20145207<信息安全系统设计基础>课程总结 链接汇总 第0周博客认识Linux系统,安装虚拟机,课本概述 第1周博客Linux系统基础命令,vim使用 第2周博客vim编辑器,GCC编译器的使用,gdb调试程序工具,Makefile自动化编译 第3周博客教材:第二章<信息的表示和处理> 第4周博客 第5周博客教材:第三章<程序的机器级表示>,理解函数调用栈帧的概念,并能用GDB进行调试 第6周博客教材:第四章<处理器体系结构> 第7周博客教材:第六章&

# 20155336 2017-2018 1 《信息安全系统设计基础》第1周学习总结

20155336 2017-2018 1 <信息安全系统设计基础>第1周学习总结 第一第七章教材内容总结 第一章: 计算机系统是由硬件和系统软件组成的,它们共同工作来运行应用程序: 信息就是位+上下文: hello.c--->hello.i--->hello.s--->hello.o; 了解编译系统的益处: 优化程序性能: 理解链接是出现的错误: 避免安全漏洞: 硬件: 总线:贯穿整个系统的一组电子管道. I/O设备:输入/输出设备. 内存:临时存储设备,用来存放程序和程序处

20145239杜文超 《信息安全系统设计基础》课程总结

20145239杜文超 <信息安全系统设计基础>课程总结 每周作业链接汇总 第0周作业: 简要内容:安装VirtualBox,安装Ubuntu,预习Linux基础入门. 二维码: 第一周作业: 简要内容:了解Linux操作系统,掌握核心的linux命令. 二维码: 第二周作业: 简要内容:熟悉Linux系统的开发环境.vi的基本操作.gcc编译器的基本原理.gcc编译器的常用选项.如何使用gdb调试技术. 二维码: 第三周作业: 简要内容:理解"信息=位+上下文". 二维码

#20155331 2017-2018 1 《信息安全系统设计基础》第11周学习总结

20155336 2017-2018 1 <信息安全系统设计基础>第1周学习总结 第一第七章教材内容总结 第一章: 计算机系统是由硬件和系统软件组成的,它们共同工作来运行应用程序: 信息就是位+上下文: hello.c--->hello.i--->hello.s--->hello.o; 了解编译系统的益处: 优化程序性能: 理解链接是出现的错误: 避免安全漏洞: 硬件: 总线:贯穿整个系统的一组电子管道. I/O设备:输入/输出设备. 内存:临时存储设备,用来存放程序和程序处