• mypwd的编译和测试


    • pwd指令及其功能

    1. 命令格式:

      pwd [选项]

    2. 命令功能:

      查看”当前工作目录“的完整路径

    3. 常用参数:

      一般情况下不带任何参数

      如果目录是链接时:

      格式:pwd -P

      显示出实际路径,而非使用连接(link)路径。

    • mypwd实现代码

    有关pwd命令实现的思考过程:

    在课堂上老师讲解了目录其实也是一种文件,只不过这种文件比较特殊,它里面存储的是一张对应表,即文件名和i节点的对应关系表,而i节点才是记录此文件详细信息的结构,如文件大小,属性,权限,存在硬盘的那个块等。

    我们在一个目录创建文件就是在这张表里添加对应关系而已,使用某个文件时也是根据i节点确定在硬盘的实际存储位置的。使用“ls -iaR"命令尝试看一下文件的i节点信息。

    所以我们可以使用系统调用chdir()
    (相当于cd),向上寻找当前目录的上一级目录;使用stat获取目录对应的iNode;其他系统调用opendir(),readdir()。在Unix的根目录下“.”和“..”所对应的iNode相同所以我们可以据此判断是否已经查找到根目录。

    1. 伪代码
    int main()
    {
        printpath()//获取当前路径并将其转换成字符串
        {
            chdir(..);//改变当前路径
           if(getinode(.)!=getinode(..))
            printpath();//递归调用直到父目录与子目录的inode的值相同
            
        }
    }
    
    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);  
    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) {  
        //  printf("/%s",str);  
            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);  
    }  
    

    代码链接

  • 相关阅读:
    curl 的用法指南
    详说 Cookie, LocalStorage 与 SessionStorage
    session,cookie和token究竟是什么
    SSL/TLS协议交互流程分析
    SSL/TLS协议运行机制的概述
    SSL常见的几个类型说明
    HTTP 的前世今生:一次性搞懂 HTTP、HTTPS、SPDY、HTT
    汉化版的脚本
    可以快速的展现当前服务器的配置、IO、SpeedTest内置下载速度的脚本
    F5 清除http 缓存
  • 原文地址:https://www.cnblogs.com/xhwh/p/7858105.html
Copyright © 2020-2023  润新知