linux pwd指令C实现
linux pwd指令C实现
整体思路
-
实现pwd命令:
-
在命令行输入pwd:显示了现在所在路径。
-
研究实现pwd所需的系统调用
-
我们可以通过man命令和grep命令来获取我们所需要的系统调用函数信息
-
man chdir
-
目录是一种文件,这种文件比较特殊,它里面存储的是一张对应表,即文件名和i节点的对应关系表,而i节点才是记录此文件详细信息的结构,如文件大小,属性,权限,存在硬盘的那个块等。在一个目录创建文件就是在这张表里添加对应关系,使用某个文件时也是根据i节点确定在硬盘的实际存储位置的。
- 可以通过
readdir(".")
来获取当前的目录。
cd ..
cd
命令返回父级目录,然后在
readdir(".");
来读取当前目录,依次执行下去。
- 所以通过实现
cd
命令,即可解决
pwd
命令
- 通过
man -k chage | grep dir
可用chdir实现
- 在根目录下运行查看
"."
".."
的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;
}