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

    学习pwd命令

    • 输入pwd命令

    • 于是 man 1 pwd查看pwd详细

    • 然后查看pwd实现需要的系统调用man -k; grep

    • 在这发现了一个功能相同的内核函数getcwd

    • 到这步就很简单了,先查看这个函数man getcwd

    实现mypwd

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <dirent.h>  
    #include <sys/types.h>  
    #include <sys/stat.h>  
    #include <string.h>  
    #include <unistd.h>  
      
    #define MAX_DIR_DEPTH (256)  //限制最大的目录深度  
    #define TRUE 1  
    #define FALSE 0  
      
    //根据文件名获取文件的inode-number  
    ino_t get_ino_byname(char *filename)  
    {  
        struct stat file_stat;  
        if(0 != stat(filename, &file_stat)) //stat()通过文件名filename获取文件信息,并保存在buf所指的结构体stat中  
        {  
            perror("stat");  
            exit(-1);  
        }  
      
        return file_stat.st_ino;  
    }  
      
    //根据inode-number, 在当前目录中查找对呀的文件名  
    char *find_name_byino(ino_t ino)  
    {  
        DIR *dp = NULL;  
        struct dirent *dptr = NULL;  
        char *filename = NULL;  
          
        if(NULL == (dp = opendir("."))) //opendir()打开一个目录,在失败的时候返回一个空的指针,成返回DIR结构体  
        {  
            fprintf(stderr, "Can not open Current Directory
    ");  
            exit(-1);  
        }  
        else  
        {  
            while(NULL != (dptr = readdir(dp))) //readdir()用来读取目录。返回是dirent结构体指针  
            {  
                if(dptr->d_ino == ino)  
                {  
                    filename = strdup(dptr->d_name); //strdup()将串拷贝到新建的位置处,返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值.  
                    break;  
                }  
            }  
      
            closedir(dp);  
        }  
      
        return filename;  
    }  
      
    int main(int argc, char *argv[])  
    {  
        //记录目名的栈  
        char *dir_stack[MAX_DIR_DEPTH];  
        unsigned current_depth = 0;  
      
        while(TRUE)  
        {  
            ino_t current_ino = get_ino_byname("."); //通过特殊的文件名"."获取当期目录的inode-number  
      
            ino_t parent_ino = get_ino_byname(".."); //通过特殊的文件名".."获取当前目录的父目录的inode-number  
      
            if(current_ino == parent_ino)  
                break;               //达到根目录,推出循环  
      
            /*两个inode-number不一样*/  
            chdir(".."); //更改当前工作目录,变为当前目录的父目录  
            dir_stack[current_depth++] = find_name_byino(current_ino); //"文件名"地址存放  
      
            if(current_depth >= MAX_DIR_DEPTH) //路径名太深  
            {  
                fprintf(stderr, "Directory tree is too deep.
    ");  
                exit(-1);  
            }  
        }  
      
        int i = current_depth - 1;  
        for(i = current_depth - 1; i >= 0; i--) //打印路径  
        {  
            fprintf(stdout, "/%s", dir_stack[i]);  
        }  
        fprintf(stdout, "%s
    ", current_depth == 0 ? "/" : "");  
      
      
        return 0;  
    }  
      
    /*
    dirent结构体:  
    struct dirent  
    {  
        long d_ino; //inode number 索引节点号  
        off_t d_off; //offset to this dirent 在目录文件中的偏移  
        unsigned short d_reclen;// length of this d_name 文件名长  
        unsigned char d_type; //the type of d_name 文件类型   
        char d_name [NAME_MAX+1]; //file name (null-terminated) 文件名,最长255字符  
    };  
    DIR结构体:  
    struct __dirstream  
    {  
        void *__fd; // `struct hurd_fd' pointer for descriptor.  
        char *__data; // Directory block.  
        int __entry_data; // Entry number `__data' corresponds to.  
        char *__ptr; // Current pointer into the block.  
        int __entry_ptr; // Entry number `__ptr' corresponds to.  
        size_t __allocation;// Space allocated for the block.  
        size_t __size; // Total valid data in the block.  
        __libc_lock_define (, __lock) // Mutex lock for this structure.  
    }
    
  • 相关阅读:
    LeetCode Find Duplicate File in System
    LeetCode 681. Next Closest Time
    LeetCode 678. Valid Parenthesis String
    LeetCode 616. Add Bold Tag in String
    LeetCode 639. Decode Ways II
    LeetCode 536. Construct Binary Tree from String
    LeetCode 539. Minimum Time Difference
    LeetCode 635. Design Log Storage System
    LeetCode Split Concatenated Strings
    LeetCode 696. Count Binary Substrings
  • 原文地址:https://www.cnblogs.com/20155220wsq/p/7860789.html
Copyright © 2011-2022 走看看