您的位置:首页 > 运维架构 > Shell

MyMiniBash之pwd命令的实现

2019-04-06 14:31 295 查看

在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 ;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: