• pwd的实现20155301


    pwd的实现

    任务要求:

    1) 学习pwd命令

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

    3) 实现mypwd

    4) 测试mypwd

    实现过程

    1)首先查看是否有有用的命令,输入man -k directory|gerp 2

    2)发现readdir好像符合我们的需求,输入man readdir查看详细资料

    3)从详细资料中发现readdir符合我们的需求,这需要头文件#inlude<dirent.h>,并且readdir定义的是一个结构体,可知该函数返回一个dirent结构体指针,dirent结构体成员如下,

     struct dirent {
                   ino_t          d_ino;       /* inode number */
                   off_t          d_off;       /* not an offset; see NOTES */
                   unsigned short d_reclen;    /* length of this record */
                   unsigned char  d_type;      /* type of file; not supported
                                                  by all filesystem types */
                   char           d_name[256]; /* filename */
               };
    

    根据老师课上的内容可以知道,linux中,文件查找不是通过文件名称来查找的。实际上是通过i节点来实现文件的查找定位的。根据在实现mypwd的过程中,我们需要用到文件的i节点,i节点跟文件的关系如下图

    因此需要用到该返回值结构体中的ino_t型的d_ino,通过该返回值来打开我们所需要的文件,此外由于根节点的节点值与其父节点的节点值是一样的,因此可以通过这个条件来进行循环。
    伪代码:

    while(1)
    {
        获取当前目录的i节点值ci;
        获取父级目录的i节点值pi;
        if(ci==pi)判断是否到达根节点;
            break;
        else
            打开至父级目录,根据获取的i节点值,在父级目录中搜索对应的文件名并记录下来;
            输出文件名则为绝对路径;
            
    }
    4)在读一个路径之前,我们需要打开这个路径,这就需要用到opendir函数,这个函数的原型是DIR *opendir(const char *name),需要的头文件是#include <sys/types.h> 和#include <dirent.h>  
    ![](http://images2017.cnblogs.com/blog/1072918/201711/1072918-20171118230537515-1576166726.png)
    
    
    5)除此之外,我们还需要知道文件的信息,这就要用到state,所需要的头文件是#include <sys/stat.h> #include <unistd.h>,使用ino_t来获取文件的节点
    
    6)在查询到了当前文件夹名称后,需要返回父目录,重复此操作,这就需要用到chdir函数,他可以改变当前路径
    ![](http://images2017.cnblogs.com/blog/1072918/201711/1072918-20171118230544999-198471059.png)
    
    
    
    7)之后就是不断地读取当前目录,并和父目录名称比对,如果当前目录和父目录的名称一致则跳出循环
    ## 完成结果
    
    ![](http://images2017.cnblogs.com/blog/1072918/201711/1072918-20171118230554968-1338459308.png)
  • 相关阅读:
    UPC OJ 一道水题 STL
    POJ2387 Til the Cows Come Home(SPFA + dijkstra + BallemFord 模板)
    HD1385Minimum Transport Cost(Floyd + 输出路径)
    POJ1679The Unique MST(次小生成树)
    POJ 1789Truck History(pirme)
    POJ2309BST(树状数组)
    POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)
    POJ2531Network Saboteur(DFS+剪枝)
    Codeforce#331 (Div. 2) A. Wilbur and Swimming Pool(谨以此题来纪念我的愚蠢)
    POJ2485Highways(prime 水题)
  • 原文地址:https://www.cnblogs.com/fengxingck/p/7858327.html
Copyright © 2020-2023  润新知