• 实现mypwd——20175204张湲祯


    实现mypwd

    任务要求:

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


    任务一:学习pwd命令

    任务步骤:

    1.pwd命令详解:
    pwd命令功能是显示当前所在工作目录的全路径吗,可以通过pwd来查看当前目录的绝对路径。
    2.pwd命令参数:
    -L:--logical,显示当前的路径,有连接文件时,直接显示连接文件的路径,(不加参数时默认此方式)。
    -p:--physical,显示当前的路径,有连接文件时,不使用连接路径,直接显示连接文件所指向的文件。 当包含多层连接文件时,显示连接文件最终指向的文件。
    3.在Linux下学习pwd命令:
    使用man pwd

    使用man -k pwd学习

    4.使用pwd命令


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

    任务步骤:

    1.pwd实现原理:pwd以绝对路径打印当前的工作目录,可以从当前目录逐层向根目录进行查找,当找到根目录,即可得到完全路径。而系统通过inode来管理文件,每个文件都有inode号(目录是特殊的文件,每个目录下有两个特殊的文件名.(当前目录)和..(父目录))。不断向前寻找到达根目录时没有父目录,两个特殊的文件名.和..仍然存在于根目录中,他们inode号相同表示同一目录。当不断查找的inode号与最初目录的inode号相同时为最终的路径。

    2.利用man -k directory | grep 3查找与路径相关的库函数,并利用命令学习getcwd,getwd函数。

    3.伪代码

    1.获得当前文件的inode号
    2.不断向前寻找直到从根目录中找到inode相同的值,找到相应的文件名
    3.输出路径
    

    任务三:实现mypwd

    任务步骤:

    1.实现代码

    #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);  //不断寻找找到与ionde相同的值,并获得文件名
    int getinode(char *);  //获得inode号
    int main()  
    {  
    printpath();  
    putchar('
    ');  
    return ;  
    }  
    
    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);  
    }
    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);  
    }  
    

    任务四:测试mypwd

    任务步骤:

    1.输入命令进行编译运行。

  • 相关阅读:
    UVA 465 Overflow (浮点数的优势)
    UVA 424 Integer Inquiry (大数相加问题)
    UVA 10494 If We Were a Child Again(大数与整型相除取整和取余)
    粘一个在UVA和ZOJ都能AC但POJ WR的代码
    UVA 340 MasterMind Hints
    UVA10815 Andy's First Dictionary
    MSComm写串口通信驱动步骤
    UVA 10106 Product (大数相乘问题)
    实现工具栏中添加的组合框接收回车消息
    UVA 10420 List of Conquests
  • 原文地址:https://www.cnblogs.com/zyzgl/p/12023658.html
Copyright © 2020-2023  润新知