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;
    }
  • 相关阅读:
    ubuntu12.04 死机 卡屏 画面冻结解决方案
    Install Firefox 20 in Ubuntu 13.04, Ubuntu 12.10, Ubuntu 12.04, Linux Mint 14 and Linux Mint 13 by PPA
    ListView1.SelectedItems.Clear()
    android studio 下载地址
    jquery.slider.js jquery幻灯片测试
    jquery.hovermenu.js
    jquery.tab.js选项卡效果
    适配 placeholder,jquery版
    jquery.autoscroll.js jquery自动滚动效果
    将 Google Earth 地图集成到自己的窗体上的 简单控件
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11800450.html
Copyright © 2011-2022 走看看