MyMiniBash之pwd命令的实现

在linux中,一切皆文件,设备是一种文件,目录也是一种文件,只不过目录文件比较特殊,它里面存储的是一张对应表,保存了文件名和i节点的对应关系表,而i节点才是记录此文件的详细信息的结构,比如文件大小、属性权限、存在硬盘的那个块的等。
内核为每一个目录都设置了一个指向自己的i节点入口,即".",还有一个指向其父节点的入口"..",我们先获取当前目录的i节点编号,但不知道当前目录的名称,可以切换到父目录中,在里面寻找当前i节点编号对应的文件名即可,利用递归来实现,终止条件为".“和”.."的节点编号相同。(根目录的节点号和父节点号是相同的)

具体实现代码:

#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<dirent.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<assert.h>

#define SIZE 128

ino_t getInode(char *dirname);//通过目录名获取inode号
void getWorkDir(ino_t inode_num);//通过节点编号获取工作目录
void inodeToDirname(ino_t inode_num, char *buf, int buflen);//通过inode号获取目录名

int main()
{
    getWorkDir( getInode("."));   //从当前目录的i节点入口开始得到当前工作目录
    printf("\n");
    return 0;
}

ino_t  getInode(char *dirname)
{
    struct stat info;//定义获取文件属性信息的结构体变量
    int information=stat(dirname, &info);
    assert(information!=-1)

    return info.st_ino;//返回该文件名的inode节点号
}

void getWorkDir(ino_t inode_num)
{
    ino_t parent_inode;//定义父节点编号
    char buf[SIZE];
    if (getInode("..") != inode_num)//当前节点号和其父节点号不相同时
    {
        chdir("..");//进入父目录
        inodeToDirname(inode_num, buf, SIZE);//获取当前节点的目录名
        parent_inode =  getInode(".");
        getWorkDir(parent_inode);//进入父节点在重复此过程,使用递归来实现
        printf("/%s", buf);打印当前的目录名
    }
}

void inodeToDirname(ino_t inode_num, char *buf,int buflen)
{
    DIR *dir_ptr;//设置目录指针
    struct dirent *dire;//定义目录结构体的指针变量
     dir_ptr = opendir(".");
    assert(dir_ptr!=NULL);

    dire=readdir(dir_ptr);
    assert(dire!=NULL);
    
    while ((dire = readdir(dir_ptr)) != NULL)//进入目录,寻找当前目录的节点
    {
        if (dire->d_ino == inode_num)//判断当前目录的节点号是不是和传入的节点号相同
        {
            strncpy(buf, dire->d_name, buflen);//拷贝目录名
            buf[strlen(buf)] = '\0';
            closedir(dir_ptr);//关闭目录
            return ;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值