linux下pwd命令的编写

时间:2022-07-02 09:18:11

ubuntu 14.04.2

目录的存储结构

  每个目录下都至少有两个内容‘.’和’..’,其中‘.’代表当前目录,’..’代表上级目录。每个目录或文件都有对应的i-节点号,根目录的‘.’和’..’相同,所以i-节点号相同。通过命令’ls -1ia’(数字1,不是字母l)可以查看当前目录下的文件名和对应的i-节点号。

pwd的具体操作过程

linux下pwd命令的编写
linux下pwd命令的编写
概括来讲,就是:
1.找到本目录的i-节点
2.进入父目录,找到i-节点对应的文件名
3.循环以上过程,直到到达根目

代码实现

#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);
}
/*下面这块每太搞明白,功能是寻找制定i-节点的目录,将目录名复制到namebuf中。
但是没明 白他是怎么寻找的*/

/*明白了,每次循环direntp都会指向下一个文件,详见testreaddir.c。
但这是怎么做到的呢?*/

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;
}

运行结果
linux下pwd命令的编写

一些函数的说明:
int result=stat(char* fname, struct stat* bufp);
stat把文件fname的信息复制到bufp所指的指针里
stat(statue的意思)结构体包含了文件的信息,在/user/include/sys/stat.h中可以看到struct stat的成员变量。

对readdir函数的测试

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
int main()
{
DIR* dir_ptr;
struct dirent* direntp;
dir_ptr = opendir(".");
while((direntp = readdir(dir_ptr)) != NULL)
{
printf("/%s\n",direntp->d_name);
}
closedir( dir_ptr);
return 0;
}

测试结果
linux下pwd命令的编写

参考文献《Unix/Linux编程实践教程》

遗留问题:为何每次循环使用readdir函数,每次返回的 struct dirent* 型指针都不相同?