zoukankan      html  css  js  c++  java
  • linux编程实现pwd命令

    linux编程实现pwd命令

    在linux中,一切皆文件。目录其实也是一种文件,只不过这种文件比较特殊,它里面存储的是一张对应表,即文件名和i节点的对应关系表,而i节点才是记录此文件详细信息的结构,如文件大小,属性,权限,存在硬盘的那个块等。我们在一个目录创建文件就是在这张表里添加对应关系而已,使用某个文件时也是根据i节点确定在硬盘的实际存储位置的。使用“ls -iaR"命令尝试看一下文件的i节点信息。

    内核为每个目录都设置了一个指向自己的i节点入口,即".",还有一个指向其父目录i节点的入口,即”..",我们首先获取当前目录的i节点编号,但是并不能知道当前目录的名称,我们切换到其的父目录,在里面寻找当前i节点编号对应的文件名即可。这样我们就很容易联想到使用递归来实现,循环的终止条件是“.”和“..”的节点编号相等。

    伪代码:

    do{
    opendir(".");
    readdir(".");
    printf("."->name);
    closedir(".");
    opendir("..");
    }while(get_inode("..") != get_inode("."))
    
    代码:
    #include<stdio.h>
    #include<sys/stat.h>
    #include<sys/types.h>
    #include<dirent.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define SIZE 128
    
    ino_t get_inode(char *dirname);
    void get_work_dir(ino_t inode_num);
    void inode_to_dirname(ino_t inode_num, char *buf, int buflen);
    
    int main(void)
    {
        get_work_dir(get_inode("."));   
        printf("
    ");
        return 0;
    
    }
    
    ino_t get_inode(char *dirname)
    {
        struct stat info;
        if (stat(dirname, &info) == -1)
        {
            perror("dirname");
            exit(1);
        }
    
        return info.st_ino;
    }
    
    void get_work_dir(ino_t inode_num)
    {
        ino_t parent_inode;
        char buf[SIZE];
        if (get_inode("..") != inode_num)
        {
            chdir("..");
            inode_to_dirname(inode_num, buf, SIZE);
            parent_inode = get_inode(".");
            get_work_dir(parent_inode);
            printf("/%s", buf);
        }
    }
    
    void inode_to_dirname(ino_t inode_num, char *buf,int buflen)
    {
        DIR *dir_ptr;
        struct dirent *dire;
        if ((dir_ptr = opendir(".")) == NULL)
        {
            perror(".");
            exit(1);
        }
    
        while ((dire = readdir(dir_ptr)) != NULL)
        {
            if (dire->d_ino == inode_num)
            {
                strncpy(buf, dire->d_name, buflen);
                buf[strlen(buf)] = '';
                closedir(dir_ptr);
                return ;
            }
        }
        fprintf(stderr, "error looking for inode number %d
    ", (int)inode_num);
        exit(1);
    }
    

    结果截图:

  • 相关阅读:
    <<C++ Primer>> 第三章 字符串, 向量和数组 术语表
    <<C++ Primer>> 第二章 变量和基本类型 术语表
    <<C++ Primer>> 第一章 开始 术语表
    PAT A1077 Kuchiguse (20)
    PAT A1035 Password (20)
    PAT A1005 Spell It Right (20)
    <<C++ Primer>> 术语表 (总) (待补充)
    PAT A1001 A+B Format (20 分)
    PAT B1048 数字加密 (20)
    Protocol
  • 原文地址:https://www.cnblogs.com/xzh1996/p/7862744.html
Copyright © 2011-2022 走看看