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('\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;
}
posted @ 2017-11-19 13:44  短爪爪爪  阅读(1819)  评论(0编辑  收藏  举报