zoukankan      html  css  js  c++  java
  • pwd函数实现

    /*
    *    文件名:mypwd.c
    *    描述:    实现简单的pwd命令
    */
    #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)
    
    //根据文件名获取文件inode-number
    ino_t get_ino_byname(char *filename)
    {
        struct stat file_stat;
        if (0 != stat(filename, &file_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(".")))
        {
            fprintf(stderr,"Can not open Current Directiory
    ");
            exit(-1);
        }
        else
        {
            while (NULL != (dptr = readdir(dp)))
            {
                if (dptr->d_ino == ino)
                {
                    filename = strdup(dptr->d_name);
                    break;
                }
            }
            closedir(dp);
        }
        return filename;
    }
    
    int main()
    {
        //记录目录名的栈
        char *dir_stack[MAX_DIR_DEPTH];
        int current_depth = 0;
    
        for(;;)
        {
            /*1.通过特殊的文件名“.”获取当前目录的inode-number*/
            ino_t current_ino = get_ino_byname(".");
    
            /*2.通过特殊的文件名“..”获取当前目录的父级目录的inode-number*/
            ino_t parent_ino = get_ino_byname("..");
    
            /*3.判断当前目录和上级目录的inode-number是否一样*/
            /*4.如果两个inode-number一样说明到达根目录*/        
            if (current_ino == parent_ino)
            {
                break;
            }
            
            /*
            5.如果两个inode-number不一样
            切换至父级目录,根据步骤1获取的inode-number,
            在父级目录中搜索对应的文件名并记录下来, 重新回到步骤1
            */
            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]);
            free(dir_stack[i]);
        }
    
        fprintf(stdout,"%s
    ",current_depth == 0 ? "/":"");
    
        return 0;
    }

    strdup()函数

    函数和功能描述:

    extern char *strdup(char *s);

    头文件:string.h

    功能: 将串拷贝到新建的位置处

    说 明:strdup不是标准的c函数。strdup()在内部调用了malloc()为变量分配内存,不需要使用返回的字符串时,需要用free()释放相应的内存空间,否则会造成内存泄漏。

    返回值:返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值。

    /*
    strdup.c
    */
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    
    int main()
    {
        char *s = "God is a girl";
        char *d;
    
        d = strdup(s);
        printf("%s",d);
    
        free(d);
    
        return 0;
    }
  • 相关阅读:
    安卓反编译
    Icesugar Gourd
    php文件写入
    java 序列化与反序列化
    Toj Dominoes Game
    adb&frida
    Markdown 测试用例
    iview InputNumber类输入框表单验证失效
    01背包问题(回溯算法实现)
    阅读作业二读Lost in CatB有感 by 李栋
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11800450.html
Copyright © 2011-2022 走看看