linux pwd指令C实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux pwd指令C实现相关的知识,希望对你有一定的参考价值。

linux pwd指令C实现

整体思路

  • 实现pwd命令:
  • 在命令行输入pwd:显示了现在所在路径。
    技术分享图片

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

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

技术分享图片

  • man chdir
    技术分享图片

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

  1. 可以通过

    readdir(".")

    来获取当前的目录。

  2. cd ..

cd

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

readdir(".");

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

  1. 所以通过实现

    cd

    命令,即可解决

    pwd

    命令

  2. 通过

    man -k chage | grep dir

    ==可用chdir实现==

  3. 在根目录下运行查看

    "."
".."

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

  1. 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(‘\\n‘);
    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] = ‘\\0‘;
            closedir( dir_ptr);
            return;
        }
    }
    fprintf( stderr , "error looking for inum % d\\n" ,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;
}


以上是关于linux pwd指令C实现的主要内容,如果未能解决你的问题,请参考以下文章

Linux-常见命令

2017-2018-3 20155337《信息安全系统设计基础》 pwd指令学习

《Linux内核 核心知识全解析(完)》

linux查找目录之文件名指令

Linux----->文件目录类操作指令

需要示例代码片段帮助