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\n");
        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.\n");
            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\n",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;
}

 

posted @ 2019-11-05 18:32  王清河  阅读(411)  评论(0编辑  收藏  举报