zoukankan      html  css  js  c++  java
  • linux pwd指令C实现

    linux pwd指令C实现

    整体思路

    • 实现pwd命令:

    • 在命令行输入pwd:显示了现在所在路径。

    • 研究实现pwd所需的系统调用

    • 我们可以通过man命令和grep命令来获取我们所需要的系统调用函数信息

    • man chdir

    • 目录是一种文件,这种文件比较特殊,它里面存储的是一张对应表,即文件名和i节点的对应关系表,而i节点才是记录此文件详细信息的结构,如文件大小,属性,权限,存在硬盘的那个块等。在一个目录创建文件就是在这张表里添加对应关系,使用某个文件时也是根据i节点确定在硬盘的实际存储位置的。

    1. 可以通过
    readdir(".")
    

    来获取当前的目录。

    cd ..
    

    cd

    命令返回父级目录,然后在

    readdir(".");
    

    来读取当前目录,依次执行下去。

    1. 所以通过实现
    cd
    

    命令,即可解决

    pwd
    

    命令

    1. 通过
    man -k chage | grep dir
    

    可用chdir实现

    1. 在根目录下运行查看
    "."
    
    ".."
    

    的i结点节点号一样的。即可作为循环的终止条件

    ls -i -a .
    

    来查看i结点值。

    概括来讲,就是:

    1.找到本目录的i-节点

    2.进入父目录,找到i-节点对应的文件名

    3.循环以上过程,直到到达根目

    伪代码

         定义一个char数组用来保存当前目录的绝对路径;
         递归:
        调用函数chdir()来改变当前程序的工作路径;(返回上一级)
        if(返回的指针==NULL)
            调用函数中存在错误,输出错误警告;
        else
            直接打印结果
        
    

    代码实现

    详细代码:

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <dirent.h>
    
    ino_t get_inode(char*);
    void printpathto(ino_t);
    void inum_to_name(ino_t,char*,int);
    int main()
    {
        printpathto(get_inode("."));  //print path to here
        putchar('
    ');
        return 0;
    }
    
    void printpathto(ino_t this_inode)
    {
        ino_t my_inode;
        char its_name[BUFSIZ];
        /*如果本目录的i-节点与上级目录不同,即本目录不是根目录*/
        if (get_inode("..")!=this_inode)                                 
        {
            chdir("..");         //进入上级目录
            inum_to_name(this_inode,its_name,BUFSIZ);
            my_inode = get_inode(".");
            printpathto(my_inode);
            printf("/%s",its_name);
        }
    }
    void inum_to_name(ino_t inode_to_find,char* namebuf,int buflen)   //找到i-节点对应的文件名,并放在字符数组里
    {
        DIR* dir_ptr;
        struct dirent* direntp;
        dir_ptr = opendir(".");
        if (dir_ptr == NULL)
        {
            perror(".");
            exit(1);
        }
     
        while((direntp = readdir(dir_ptr)) != NULL)
        {
            if(direntp->d_ino == inode_to_find)
            {
                strncpy(namebuf,direntp->d_name,buflen);
                namebuf[buflen-1] = '';
                closedir( dir_ptr);
                return;
            }
        }
        fprintf( stderr , "error looking for inum % d
    " ,inode_to_find);
        exit (1) ;
    }
    ino_t get_inode(char* fname)            //根据文件名,返回-i节点
    {
        struct stat info;
        if ( stat( fname, &info) == -1){
            fprintf( stderr , "Cannot stat ");
            perror(fname);
            exit (1);
        }
        return info.st_ino;
    }
    
  • 相关阅读:
    1分2分5分的硬币,组成1角,共有多少种组合
    二叉树结点间最大距离
    五猴分桃问题
    大数加法、乘法
    Java内存回收机制全解(算法+内存分配)
    java实现两个大数相加,可能出现溢出错误
    如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)
    已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10
    Windows Phone 使用 HttpWebRequest 对象,通过POST 方式上传图片
    Windows Phone 内存检测方法
  • 原文地址:https://www.cnblogs.com/lsqsjsj/p/7859603.html
Copyright © 2011-2022 走看看