zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155216 《信息安全系统设计基础》 实现mypwd

    2017-2018-1 20155216 《信息安全系统设计基础》 实现mypwd

    作业要求:

    1、学习pwd命令

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

    3、实现mypwd

    4、测试mypwd

    1、学习pwd命令

    pwd 命令查看默认工作目录的完整路径

    -L 目录连接链接时,输出连接路径

    -P 输出物理路径

    当前目录被删除了,而pwd命令仍然显示那个目录

    2、研究pwd命令

    使用 man -k 查看系统调用

    伪代码:

    
    1、根据inode-number ,在当前目录中查找对应的文件名
    
    2、限制最大的目录深度
    
    3、记录目录名的栈
    
    4、通过特殊的文件名“.”获取当前目录的inode-number
     
    5、通过特殊的文件名“..”获取当前目录的父级目录的inode-number
    
    6、判断当前目录和上级目录的inode-number是否一样
    
    7、如果两个inode-number一样说明到达根目录
    
    8、如果两个inode-number不一样
    
    9、切换至父级目录,根据步骤1获取的inode-number,在父级目录中搜索对应的文件名并记录下来, 重新回到步骤1
    
    10、如果路径名太深,则提示
    
    11、输出完整路径名
    
    

    3、实现pwd命令:

    C语言代码:

    #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);  
    
    }  
    
    
    

    4、测试pwd命令

  • 相关阅读:
    [概率论]2017.5.9
    [概率论] 2017 5.2
    [离散数学II]2017.5.2
    [离散数学II]2017.4.25
    [概率论]2017.4.19
    [概率论] 2017.4.18
    [离散数学II]2017.4.18
    [离散数学II]2017.4.11
    [概率论]2017.4.12
    [概率论]2017.4.5
  • 原文地址:https://www.cnblogs.com/LeeX1997/p/7853232.html
Copyright © 2011-2022 走看看