• 实现mypwd


    - 实现mypwd

    - 任务要求:

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

    提交过程博客的链接

    - 实现过程:

    - 学习pwd命令

    • 功能:查看”当前工作目录“的完整路径

    • 命令格式:pwd

    • 使用man命令查看pwd

    • 实现pwd

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

    • man -k directory|grep 2

    因为pwd是查看当前工作目录的路径,因此应该查找有关目录的有关信息,即directory。使用命令
    man -k directory|grep 2 查找,可发现getcwd的功能是“得到当前工作目录”。符合要求,通过man命令查看其帮助文档。

    • man getcwd

    这里可发现getcwd的工作原理:这些函数返回一个以空结尾的字符串,该字符串包含一个绝对路径名,该路径名是调用进程的当前工作目录。路径名作为函数结果返回,如果存在,则通过参数BUF返回。

    我们需要的就是这个参数BUF,而BUF是一个定义的指针,所以可据此写伪代码。

    • 伪代码
    定义一个字符串数组,用于存放绝对路径;
    定义一个指针BUF;
    getcwd();
    if(BUF)
    打印存放的路径名;
    else
    出错;
    

    - 实现mypwd

    • int getinode(char *);
      该函数功能是显示当前目录的inode。功能实现是调用了stat,stat用于显示文件或文件系统的详细信息。此处返回当前目录的inode。

    • char *inode_to_name(int);
      该函数功能是存储绝对路径。功能实现是调用了dir、dirent、opendir、readdir等,将每一次获取的文件夹目录内容进行复制,存储并返回。

    • void printpath();
      该函数功能是打印路径。功能实现是调用了getinode函数和inode_to_name函数,即从当前目录开始,不断返回上一层目录,比较当前目录与上一层目录的inode是否相同,若相同则表明返回到了根目录,然后将指针中存储的路径返回并打印。

    • mypwd代码:

    #include<stdio.h>  
    #include<sys/stat.h>  
    #include<dirent.h>  
    #include<stdlib.h>  
    #include<string.h>  
    #include<sys/types.h>  
    void printpath();  
    char *inode_to_name(int);  
    int getinode(char *);  
    int main()  
    {  
        printpath();  
        putchar('
    ');  
        return ;  
    }  
    void printpath()  
    {  
        int inode,up_inode;  
        char *str;  
        inode = getinode(".");  
        up_inode = getinode("..");  
        chdir("..");  
        str = inode_to_name(inode);  
        if(inode == up_inode) {  
            return;  
        }  
        printpath();  
        printf("/%s",str);  
    }  
    int getinode(char *str)  
    {  
        struct stat st;  
        if(stat(str,&st) == -1){  
            perror(str);  
            exit(-1);  
        }  
        return st.st_ino;  
    }  
    char *inode_to_name(int inode)  
    {  
        char *str;  
        DIR *dirp;  
        struct dirent *dirt;  
        if((dirp = opendir(".")) == NULL){  
            perror(".");  
            exit(-1);  
        }  
        while((dirt = readdir(dirp)) != NULL)  
        {  
            if(dirt->d_ino == inode){  
                str = (char *)malloc(strlen(dirt->d_name)*sizeof(char));  
                strcpy(str,dirt->d_name);  
                return str;  
            }  
        }  
        perror(".");  
        exit(-1);  
    }
    

    - 测试mypwd

    - 体会

    这次是利用c语言实现pwd命令,思路还算比较清晰,但在编写代码上还是存在困难,我学习并借鉴了网上的代码,实现了mypwd,收获还是挺大的。

  • 相关阅读:
    Effective C++ 读书笔记之Part1.Accustoming Yourself to C++
    Effective C++ 读书笔记之Part4.Design and Declarations
    Effective C++ 读书笔记之Part5.Implementations
    给程序猿三条身体保健的建议
    亮剑.NET的系列文章之.NET详解(开端)
    [转]英特尔工具使在多个处理器上实现线程化更加轻松
    [转]TrackBack Technical Specification
    Chapter 03 Writing Executable Statements 01
    Chapter 09Manipulating Data 01
    Chapter 00 Overview to PL/SQL
  • 原文地址:https://www.cnblogs.com/brs666/p/10009823.html
Copyright © 2020-2023  润新知