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 ; } } }
相关文章推荐
- MyMiniBash之su命令
- MyMiniBash之sleep命令
- pwd 命令实现
- 20155308 加分项——C语言实现Linux的pwd命令
- Linux命令:pwd的实现
- ohmyzsh+autojump+incr(Incremental)实现快速定位命令 自动补全目录
- Unix文件系统和pwd命令实现 一
- linux命令实现:pwd
- 一条命令实现bash和dash的转换
- Linux命令简单实现 -- pwd
- C语言实现linux pwd命令
- 2017-2018-1 20155339 第十一周加分项Linux下Mypwd的实现
- Unix文件系统和pwd命令实现 二
- 使用变参函数实现pwd命令
- linux编程实践:实现pwd命令
- pwd命令的实现
- Linux 下几个文件操作命令的代码实现+myfind find 查找命令 实现
- pwd命令的简单实现
- 20155322 2017-2018-1《信息安全系统设计》第九周 Linux命令:pwd命令学习与简单实现
- 2017-2018-1 20155215 第九周 加分项 PWD命令的实现