zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155214 《信息安全系统设计基础》 第9周课下测试-mypwd

    2017-2018-1 20155214 《信息安全系统设计基础》

    第9周课下测试-mypwd(深入版)

    题目要求:
    1 学习pwd命令
    2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码
    3 实现mypwd
    4 测试mypwd

    • 在第9周学习总结中,我直接调用了系统调用getcwd()输出当前绝对路径。这次我尝试用c语言实现它的功能。

    函数原型

    #include <unistd.h>
    char *getcwd(char *buf, size_t size);
    

    getcwd () 函数将当前工作目录的绝对路径名复制到由 buf (长度大小) 指向的数组。
    如果当前工作目录的绝对路径名 (包括终止的 null 字节) 的长度超过了大小字节, 则 null 为返回, errno 设置为 ERANGE;应用程序应检查此错误, 并在必要时分配较大的缓冲区。

    相关函数

    • chdir()
      将当前工作路径更改至函数输入字符串路径path

    我决定看看pwd源码

    • 找到week03下载的源码包coreutils,很幸运里面有pwd.c

    • 源码流程很清晰,从主函数main中了解到,pwd共有3种函数来产生绝对路径:
      1.logical_getcwd()
      2.xgetcwd()
      3.robust_getcwd()

    具体函数分析

    logical_getcwd()

    • 作为pwd最主要的调用函数,logical_getcwd()写的很简练只有23行。简单的逻辑分析如下:
    line304: getenv()函数搜索环境列表以查找环境变量名称,并返回一个指向相应值字符串”PWD“的指针。
    line310:用指针p修改wd
    line311-317 循环体退出条件为p为空,循环调用strstr(),作用为寻找父节点的指针
    line320-321 返回判断条件,当当前wd节点与父节点为相同节点时,返回wd。
    

    xgetcwd()

    通过调用头文件 xgetcwd.h获得

    robust_getcwd()

    • 当调用到该函数时,利用filename_start来储存绝对路径
    line279: 用stat数组dot_sb储存父节点信息。
    line281-289: 无限循环,循环体内调用find_dir_entry()进入父节点,当父节点为根节点```root_dev_ino```时,退出循环
    

    mypwd

  • 相关阅读:
    hdoj5327【前缀和思想】
    codeforces 611C
    codeforces 632C
    poj1163 【记忆化搜索·水】
    2016 Multi-University Training Contest 2 A Acperience
    细剖最短路【闲谈,权当是饭后杂文】
    poj1724【最短路】
    [YY题]HDOJ5288 OO’s Sequence
    Codeforces Round #363 (Div. 2) C. Vacations
    POJ2105【进制转化】
  • 原文地址:https://www.cnblogs.com/besti155214/p/8011516.html
Copyright © 2011-2022 走看看